
Mam taki problemik. Przy probie utworzenia tabeli wyskakuje mi nastepujacy blad:
Błąd: 1005 : Can't create table '.\projekt2\t_transformatory.frm' (errno: 150)
zastosowany kod:
<span style="font-weight: bold;"><span style="text-decoration: underline;">#tabela $izolacja CREATE TABLE IF NOT EXISTS '.$izolacja.'( id smallint UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL, izolacja_uzwojenia varchar(15) NOT NULL )TYPE=InnoDB; <span style="font-weight: bold;"><span style="text-decoration: underline;">#tabela $producent CREATE TABLE IF NOT EXISTS '.$producent.'( id_producent smallint UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL, nazwa varchar(60) NOT NULL, kod_pocztowy varchar(6) NOT NULL, miasto varchar(60) NOT NULL, ulica varchar(60) NOT NULL, nr_telefonu varchar(20) NOT NULL, INDEX id_prod (id_producent) )TYPE=InnoDB; <span style="font-weight: bold;"><span style="text-decoration: underline;">#tabela $przekladnia CREATE TABLE IF NOT EXISTS '.$przekladnia.'( id_przekladnia smallint UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL, przekladnia varchar(15) NOT NULL, INDEX id_przekl (id_przekladnia) )TYPE=InnoDB; <span style="font-weight: bold;"><span style="text-decoration: underline;">#tabela $rodzaj_uzwojenia CREATE TABLE IF NOT EXISTS '.$rodzaj_uzwojenia.'( id_rodzaj smallint UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL, rodzaj_uzwojenia varchar(15) NOT NULL, INDEX id_rodz (id_rodzaj) )TYPE=InnoDB; <span style="font-weight: bold;"><span style="text-decoration: underline;">#tabela $uklad_polaczen CREATE TABLE IF NOT EXISTS '.$uklad_polaczen.'( id_uklad smallint UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL, uklad_polaczen varchar(6) NOT NULL, INDEX id_uklad (id_uklad) )TYPE=InnoDB; <span style="font-weight: bold;"><span style="text-decoration: underline;">#tabela $transformator CREATE TABLE IF NOT EXISTS '.$transformator.'( id_trafo smallint UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL, typ varchar(15) NOT NULL, moc_zn int NOT NULL, zakres_regulacji blob NOT NULL, nap_zwarcia float(4,1) NOT NULL, straty_jal mediumint NOT NULL, straty_obc mediumint NOT NULL, prad_jal float(4,1) NOT NULL, id_producent smallint NOT NULL, id_izolacja smallint NOT NULL, id_rodzaj_gorne smallint NOT NULL, id_rodzaj_dolne smallint NOT NULL, id_przekladnia smallint NOT NULL, id_uklad smallint NOT NULL, INDEX prod (id_producent), FOREIGN KEY (id_producent) REFERENCES '.$producent.'(id_producent) ON UPDATE CASCADE ON DELETE RESTRICT, INDEX izol (id_izolacja), FOREIGN KEY (id_izolacja) REFERENCES '.$izolacja.'(id) ON UPDATE CASCADE ON DELETE RESTRICT, INDEX rodzaj_gorne (id_rodzaj_gorne), FOREIGN KEY (id_rodzaj_gorne) REFERENCES '.$rodzaj_uzwojenia.'(id_rodzaj_gorne) ON UPDATE CASCADE ON DELETE RESTRICT, INDEX rodzaj_dolne (id_rodzaj_dolne), FOREIGN KEY (id_rodzaj_dolne) REFERENCES '.$rodzaj_uzwojenia.'(id_rodzaj) ON UPDATE CASCADE ON DELETE RESTRICT, INDEX przekladnia (id_przekladnia), FOREIGN KEY (id_przekladnia) REFERENCES '.$przekladnia.'(id_przekladnia) ON UPDATE CASCADE ON DELETE RESTRICT, INDEX uklad (id_uklad), FOREIGN KEY (id_uklad) REFERENCES '.$uklad_polaczen.'(id_uklad) ON UPDATE CASCADE ON DELETE RESTRICT )TYPE=InnoDB';
czytalem tu na forum tematy o podobnych problemach (tu i tu) oraz to: klik. i nic to nie pomoglo. w phpmyadmin sprawdzalem, przy tworzeniu nowej tabeli moge wybrac InnoDB, wiec chyba obsluguje. moze ktos wie, gdzie lezy blad ? (tylko prosze nie pisac, ze w tym kodzie powyzej


za kazda pomoc z gory dziekuje.
wersja mysql: 4.0.20a-nt.
/edit/ utworzylem baze bez kluczy obcych, z poziomu phpmyadmin dodalem indeksy (na razie dla 1 pola) dla id_izolacja, indeks dodalo, w tabeli "indeksy" w phpmyadmin indeks jest widoczny. nastepnie klikam na widok relacyjny, dla pola id_izolacja moge wybrac pole klucza obcego, wiec wybieram t_izolacja>id_izolacja, dalej jakies opcje dla pol on delete i on update. wybieram "wykonaj" i blad: "Brak zdefiniowanego indeksu! (izolacja_id)". A przeciez indeks jest zdefiniowany ! Ktos cos wie na ten temat ?
pozdrawiam.
/edit 2/
no to odpowiem sobie sam -> moze komus sie przyda

powinno byc:
<span style="font-weight: bold;"><span style="text-decoration: underline;">#tabela $izolacja CREATE TABLE IF NOT EXISTS '.$izolacja.'( id smallint UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL, izolacja_uzwojenia varchar(15) NOT NULL )TYPE=InnoDB; <span style="font-weight: bold;"><span style="text-decoration: underline;">#tabela $producent CREATE TABLE IF NOT EXISTS '.$producent.'( id_producent smallint UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL, nazwa varchar(60) NOT NULL, kod_pocztowy varchar(6) NOT NULL, miasto varchar(60) NOT NULL, ulica varchar(60) NOT NULL, nr_telefonu varchar(20) NOT NULL, INDEX id_prod (id_producent) )TYPE=InnoDB; <span style="font-weight: bold;"><span style="text-decoration: underline;">#tabela $przekladnia CREATE TABLE IF NOT EXISTS '.$przekladnia.'( id_przekladnia smallint UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL, przekladnia varchar(15) NOT NULL, INDEX id_przekl (id_przekladnia) )TYPE=InnoDB; <span style="font-weight: bold;"><span style="text-decoration: underline;">#tabela $rodzaj_uzwojenia CREATE TABLE IF NOT EXISTS '.$rodzaj_uzwojenia.'( id_rodzaj smallint UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL, rodzaj_uzwojenia varchar(15) NOT NULL, INDEX id_rodz (id_rodzaj) )TYPE=InnoDB; <span style="font-weight: bold;"><span style="text-decoration: underline;">#tabela $uklad_polaczen CREATE TABLE IF NOT EXISTS '.$uklad_polaczen.'( id_uklad smallint UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL, uklad_polaczen varchar(6) NOT NULL, INDEX id_uklad (id_uklad) )TYPE=InnoDB; <span style="font-weight: bold;"><span style="text-decoration: underline;">#tabela $transformator CREATE TABLE IF NOT EXISTS '.$transformator.'( id_trafo smallint UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL, typ varchar(15) NOT NULL, moc_zn int NOT NULL, zakres_regulacji blob NOT NULL, nap_zwarcia float(4,1) NOT NULL, straty_jal mediumint NOT NULL, straty_obc mediumint NOT NULL, prad_jal float(4,1) NOT NULL, id_producent smallint UNSIGNED NOT NULL, id_izolacja smallint UNSIGNED NOT NULL, id_rodzaj_gorne smallint UNSIGNED NOT NULL, id_rodzaj_dolne smallint UNSIGNED NOT NULL, id_przekladnia smallint UNSIGNED NOT NULL, id_uklad smallint [COLOR=red]UNSIGNED[/COLOR] NOT NULL, INDEX prod (id_producent), FOREIGN KEY (id_producent) REFERENCES '.$producent.'(id_producent) ON UPDATE CASCADE ON DELETE RESTRICT, INDEX izol (id_izolacja), FOREIGN KEY (id_izolacja) REFERENCES '.$izolacja.'(id) ON UPDATE CASCADE ON DELETE RESTRICT, INDEX rodzaj_gorne (id_rodzaj_gorne), FOREIGN KEY (id_rodzaj_gorne) REFERENCES '.$rodzaj_uzwojenia.'(id_rodzaj) ON UPDATE CASCADE ON DELETE RESTRICT, INDEX rodzaj_dolne (id_rodzaj_dolne), FOREIGN KEY (id_rodzaj_dolne) REFERENCES '.$rodzaj_uzwojenia.'(id_rodzaj) ON UPDATE CASCADE ON DELETE RESTRICT, INDEX przekladnia (id_przekladnia), FOREIGN KEY (id_przekladnia) REFERENCES '.$przekladnia.'(id_przekladnia) ON UPDATE CASCADE ON DELETE RESTRICT, INDEX uklad (id_uklad), FOREIGN KEY (id_uklad) REFERENCES '.$uklad_polaczen.'(id_uklad) ON UPDATE CASCADE ON DELETE RESTRICT )TYPE=InnoDB';
czyli nie zgadzaly sie typy danych (brakowalo unsigned w kluczach obcych w tabeli $transformator).
tak btw to takie rzeczy, ktore przy tym znalazlem, a na ktore nalezy zwracac uwage to:
- zgodnosc kodowania - nie moze byc tak, ze jedno pole ma np utf a drugie np latin (dot np char, varchar)
- dokladna zgodnosc typow danych jednego i drugiego pola (u mnie brak unsigned w kluczu obcym powodowal wspomniany error)
- obydwie tabele musza byc InnoDB
- no i klucze obce musza byc najpierw zaindeksowane (o tym juz tu bylo)
pomocne przy szukaniu bledu moze byc polecenie:
SHOW INNODB STATUS
no coz, pewnie osoby obeznane to wiedzialy, ale moze poczatkujacym takim jak ja sie przyda

pozdrawiam.