Witam na forum smile.gif
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:
  1. <span style="font-weight: bold;"><span style="text-decoration: underline;">#tabela $izolacja
  2. CREATE TABLE IF NOT EXISTS '.$izolacja.'(
  3. id smallint UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL,
  4. izolacja_uzwojenia varchar(15) NOT NULL
  5. )TYPE=InnoDB;
  6.  
  7. <span style="font-weight: bold;"><span style="text-decoration: underline;">#tabela $producent
  8. CREATE TABLE IF NOT EXISTS '.$producent.'(
  9. id_producent smallint UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL,
  10. nazwa varchar(60) NOT NULL,
  11. kod_pocztowy varchar(6) NOT NULL,
  12. miasto varchar(60) NOT NULL,
  13. ulica varchar(60) NOT NULL,
  14. nr_telefonu varchar(20) NOT NULL,
  15. INDEX id_prod (id_producent)
  16. )TYPE=InnoDB;
  17.  
  18. <span style="font-weight: bold;"><span style="text-decoration: underline;">#tabela $przekladnia
  19. CREATE TABLE IF NOT EXISTS '.$przekladnia.'(
  20. id_przekladnia smallint UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL,
  21. przekladnia varchar(15) NOT NULL,
  22. INDEX id_przekl (id_przekladnia)
  23. )TYPE=InnoDB;
  24.  
  25. <span style="font-weight: bold;"><span style="text-decoration: underline;">#tabela $rodzaj_uzwojenia
  26. CREATE TABLE IF NOT EXISTS '.$rodzaj_uzwojenia.'(
  27. id_rodzaj smallint UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL,
  28. rodzaj_uzwojenia varchar(15) NOT NULL,
  29. INDEX id_rodz (id_rodzaj)
  30. )TYPE=InnoDB;
  31.  
  32. <span style="font-weight: bold;"><span style="text-decoration: underline;">#tabela $uklad_polaczen
  33. CREATE TABLE IF NOT EXISTS '.$uklad_polaczen.'(
  34. id_uklad smallint UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL,
  35. uklad_polaczen varchar(6) NOT NULL,
  36. INDEX id_uklad (id_uklad)
  37. )TYPE=InnoDB;
  38.  
  39. <span style="font-weight: bold;"><span style="text-decoration: underline;">#tabela $transformator
  40. CREATE TABLE IF NOT EXISTS '.$transformator.'(
  41. id_trafo smallint UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL,
  42. typ varchar(15) NOT NULL,
  43. moc_zn int NOT NULL,
  44. zakres_regulacji blob NOT NULL,
  45. nap_zwarcia float(4,1) NOT NULL,
  46. straty_jal mediumint NOT NULL,
  47. straty_obc mediumint NOT NULL,
  48. prad_jal float(4,1) NOT NULL,
  49. id_producent smallint NOT NULL,
  50. id_izolacja smallint NOT NULL,
  51. id_rodzaj_gorne smallint NOT NULL,
  52. id_rodzaj_dolne smallint NOT NULL,
  53. id_przekladnia smallint NOT NULL,
  54. id_uklad smallint NOT NULL,
  55. INDEX prod (id_producent),
  56. FOREIGN KEY (id_producent) REFERENCES '.$producent.'(id_producent) ON UPDATE CASCADE ON DELETE RESTRICT,
  57. INDEX izol (id_izolacja),
  58. FOREIGN KEY (id_izolacja) REFERENCES '.$izolacja.'(id) ON UPDATE CASCADE ON DELETE RESTRICT,
  59. INDEX rodzaj_gorne (id_rodzaj_gorne),
  60. FOREIGN KEY (id_rodzaj_gorne) REFERENCES '.$rodzaj_uzwojenia.'(id_rodzaj_gorne) ON UPDATE CASCADE ON DELETE RESTRICT,
  61. INDEX rodzaj_dolne (id_rodzaj_dolne),
  62. FOREIGN KEY (id_rodzaj_dolne) REFERENCES '.$rodzaj_uzwojenia.'(id_rodzaj) ON UPDATE CASCADE ON DELETE RESTRICT,
  63. INDEX przekladnia (id_przekladnia),
  64. FOREIGN KEY (id_przekladnia) REFERENCES '.$przekladnia.'(id_przekladnia) ON UPDATE CASCADE ON DELETE RESTRICT,
  65. INDEX uklad (id_uklad),
  66. FOREIGN KEY (id_uklad) REFERENCES '.$uklad_polaczen.'(id_uklad) ON UPDATE CASCADE ON DELETE RESTRICT
  67. )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 biggrin.gif laugh.gif )
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 smile.gif

powinno byc:
  1. <span style="font-weight: bold;"><span style="text-decoration: underline;">#tabela $izolacja
  2. CREATE TABLE IF NOT EXISTS '.$izolacja.'(
  3. id smallint UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL,
  4. izolacja_uzwojenia varchar(15) NOT NULL
  5. )TYPE=InnoDB;
  6.  
  7. <span style="font-weight: bold;"><span style="text-decoration: underline;">#tabela $producent
  8. CREATE TABLE IF NOT EXISTS '.$producent.'(
  9. id_producent smallint UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL,
  10. nazwa varchar(60) NOT NULL,
  11. kod_pocztowy varchar(6) NOT NULL,
  12. miasto varchar(60) NOT NULL,
  13. ulica varchar(60) NOT NULL,
  14. nr_telefonu varchar(20) NOT NULL,
  15. INDEX id_prod (id_producent)
  16. )TYPE=InnoDB;
  17.  
  18. <span style="font-weight: bold;"><span style="text-decoration: underline;">#tabela $przekladnia
  19. CREATE TABLE IF NOT EXISTS '.$przekladnia.'(
  20. id_przekladnia smallint UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL,
  21. przekladnia varchar(15) NOT NULL,
  22. INDEX id_przekl (id_przekladnia)
  23. )TYPE=InnoDB;
  24.  
  25. <span style="font-weight: bold;"><span style="text-decoration: underline;">#tabela $rodzaj_uzwojenia
  26. CREATE TABLE IF NOT EXISTS '.$rodzaj_uzwojenia.'(
  27. id_rodzaj smallint UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL,
  28. rodzaj_uzwojenia varchar(15) NOT NULL,
  29. INDEX id_rodz (id_rodzaj)
  30. )TYPE=InnoDB;
  31.  
  32. <span style="font-weight: bold;"><span style="text-decoration: underline;">#tabela $uklad_polaczen
  33. CREATE TABLE IF NOT EXISTS '.$uklad_polaczen.'(
  34. id_uklad smallint UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL,
  35. uklad_polaczen varchar(6) NOT NULL,
  36. INDEX id_uklad (id_uklad)
  37. )TYPE=InnoDB;
  38.  
  39. <span style="font-weight: bold;"><span style="text-decoration: underline;">#tabela $transformator
  40. CREATE TABLE IF NOT EXISTS '.$transformator.'(
  41. id_trafo smallint UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL,
  42. typ varchar(15) NOT NULL,
  43. moc_zn int NOT NULL,
  44. zakres_regulacji blob NOT NULL,
  45. nap_zwarcia float(4,1) NOT NULL,
  46. straty_jal mediumint NOT NULL,
  47. straty_obc mediumint NOT NULL,
  48. prad_jal float(4,1) NOT NULL,
  49. id_producent smallint UNSIGNED NOT NULL,
  50. id_izolacja smallint UNSIGNED NOT NULL,
  51. id_rodzaj_gorne smallint UNSIGNED NOT NULL,
  52. id_rodzaj_dolne smallint UNSIGNED NOT NULL,
  53. id_przekladnia smallint UNSIGNED NOT NULL,
  54. id_uklad smallint [COLOR=red]UNSIGNED[/COLOR] NOT NULL,
  55. INDEX prod (id_producent),
  56. FOREIGN KEY (id_producent) REFERENCES '.$producent.'(id_producent) ON UPDATE CASCADE ON DELETE RESTRICT,
  57. INDEX izol (id_izolacja),
  58. FOREIGN KEY (id_izolacja) REFERENCES '.$izolacja.'(id) ON UPDATE CASCADE ON DELETE RESTRICT,
  59. INDEX rodzaj_gorne (id_rodzaj_gorne),
  60. FOREIGN KEY (id_rodzaj_gorne) REFERENCES '.$rodzaj_uzwojenia.'(id_rodzaj) ON UPDATE CASCADE ON DELETE RESTRICT,
  61. INDEX rodzaj_dolne (id_rodzaj_dolne),
  62. FOREIGN KEY (id_rodzaj_dolne) REFERENCES '.$rodzaj_uzwojenia.'(id_rodzaj) ON UPDATE CASCADE ON DELETE RESTRICT,
  63. INDEX przekladnia (id_przekladnia),
  64. FOREIGN KEY (id_przekladnia) REFERENCES '.$przekladnia.'(id_przekladnia) ON UPDATE CASCADE ON DELETE RESTRICT,
  65. INDEX uklad (id_uklad),
  66. FOREIGN KEY (id_uklad) REFERENCES '.$uklad_polaczen.'(id_uklad) ON UPDATE CASCADE ON DELETE RESTRICT
  67. )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:
  1. SHOW INNODB STATUS


no coz, pewnie osoby obeznane to wiedzialy, ale moze poczatkujacym takim jak ja sie przyda rolleyes.gif

pozdrawiam.