Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: blad 1005
Forum PHP.pl > Forum > Bazy danych > MySQL
mhs
Witam wszystkich...

Mam nastepujace pytanie. Podczas tworzenia bazy danych system (MySQL) wyrzuca mi nastepujacy blad:

Kod
ERROR 1005: Nie mo┐na stworzyŠ tabeli '.ankieta#sql-898_37.frm' (Kod b│ŕdu: 150)


Niestety to co znalazlem w manualu na ten temat nie wiele mi mowi. Nadal nie wiem gdzie lezy blad. Ponizej przedstawiam kod sql.

[sql:1:14aa9c49d8]
CREATE TABLE glosujacy (
glosujacy_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
glosujacy_agent VARCHAR(128) NOT NULL,
glosujacy_czas TIMESTAMP NOT NULL DEFAULT 'CURRENT_TIMESTAMP',
glosujacy_sesja VARCHAR(32) NOT NULL,
PRIMARY KEY (glosujacy_id),
UNIQUE (glosujacy_sesja)
) Type = InnoDB;

CREATE TABLE glosujacy_dane (
glosujacy_id INTEGER UNSIGNED NOT NULL,
glosujacy_plec ENUM('K','M') NOT NULL,
glosujacy_urodzony CHAR(4) NOT NULL,
wojewodztwa_id INTEGER UNSIGNED NOT NULL,
PRIMARY KEY (glosujacy_id)
) Type = InnoDB;

CREATE TABLE wojewodztwa (
wojewodztwa_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
wojewodztwa_nazwa CHAR(20) NOT NULL,
PRIMARY KEY (wojewodztwa_id),
UNIQUE (wojewodztwa_nazwa)
) Type = InnoDB;

CREATE TABLE ankiety (
ankieta_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
ankieta_nazwa VARCHAR(32) NOT NULL,
ankieta_opis TEXT NOT NULL,
ankieta_start DATE NOT NULL,
ankieta_stop DATE NOT NULL,
PRIMARY KEY (ankieta_id)
) Type = InnoDB;

CREATE TABLE ankieta_biezaca (
ankieta_id INTEGER UNSIGNED NOT NULL,
PRIMARY KEY (ankieta_id)
) Type = InnoDB;

CREATE TABLE pytania (
pytanie_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
ankieta_id INTEGER UNSIGNED NOT NULL,
pytanie_tresc VARCHAR(255) NOT NULL,
PRIMARY KEY (pytanie_id)
) Type = InnoDB;

CREATE TABLE odpowiedzi (
odpowiedz_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
pytanie_id INTEGER UNSIGNED NOT NULL,
odpowiedz_tresc VARCHAR(255) NOT NULL,
PRIMARY KEY (odpowiedz_id)
) Type = InnoDB;

CREATE TABLE glosujacy_odpowiedzi (
glosujacy_id INTEGER UNSIGNED NOT NULL,
odpowiedz_id INTEGER UNSIGNED NOT NULL,
PRIMARY KEY (glosujacy_id, odpowiedz_id)
) Type = InnoDB;

ALTER TABLE glosujacy_dane
ADD FOREIGN KEY (glosujacy_id) REFERENCES glosujacy (glosujacy_id) ON DELETE RESTRICT ON UPDATE RESTRICT;

ALTER TABLE glosujacy_dane
ADD FOREIGN KEY (wojewodztwa_id) REFERENCES wojewodztwa (wojewodztwa_id) ON DELETE RESTRICT ON UPDATE RESTRICT;

ALTER TABLE ankieta_biezaca
ADD FOREIGN KEY (ankieta_id) REFERENCES ankiety (ankieta_id) ON DELETE RESTRICT ON UPDATE RESTRICT;

ALTER TABLE pytania
ADD FOREIGN KEY (ankieta_id) REFERENCES ankiety (ankieta_id) ON DELETE RESTRICT ON UPDATE RESTRICT;

ALTER TABLE odpowiedzi
ADD FOREIGN KEY (pytanie_id) REFERENCES pytania (pytanie_id) ON DELETE RESTRICT ON UPDATE RESTRICT;

ALTER TABLE glosujacy_odpowiedzi
ADD FOREIGN KEY (odpowiedz_id) REFERENCES odpowiedzi (odpowiedz_id) ON DELETE RESTRICT ON UPDATE RESTRICT;

ALTER TABLE glosujacy_odpowiedzi
ADD FOREIGN KEY (glosujacy_id) REFERENCES glosujacy (glosujacy_id) ON DELETE RESTRICT ON UPDATE RESTRICT;

[/sql:1:14aa9c49d8]

Dodam, ze korzystam z wersji 4.0.15-max-nt

Mam tez jeszcze jedno pytanie. Mimo iz przy danym polu mam ustawione NOT NULL to system dopuszcza wprowadzenie rekordu z pusta wartoscia w tym polu. Dlaczego sie tak dzieje?

Dzieki za odpowiedzi.
adwol
Cytat
Niestety to co znalazlem w manualu na ten temat nie wiele mi mowi. Nadal nie wiem gdzie lezy blad. Ponizej przedstawiam kod sql.

Klucze obce mogą być zakładane tylko na indeksowanych kolumnach. Dołóż sobie takie zapytania przed dokładaniem tych kluczy.
[sql:1:d65392f5ff]ALTER TABLE glosujacy_dane ADD INDEX (wojewodztwa_id)
ALTER TABLE pytania ADD INDEX (ankieta_id)
ALTER TABLE odpowiedzi ADD INDEX (pytanie_id)
ALTER TABLE glosujacy_odpowiedzi ADD INDEX (odpowiedz_id)
[/sql:1:d65392f5ff]
Cytat
Mimo iz przy danym polu mam ustawione NOT NULL to system dopuszcza wprowadzenie rekordu z pusta wartoscia w tym polu. Dlaczego sie tak dzieje?

Co znaczy pustą? Masz na myśli wykonanie takiego zapytania (kolumna a jest NOT NULL)?
[sql:1:d65392f5ff]INSERT INTO tabela (a) VALUES ('')[/sql:1:d65392f5ff]
Ograniczenie NOT NULL mówi, że nie może być w kolumnie wartości specjalnej NULL, która nie ma nic wspólnego z ciągiem pustym, liczbą 0, itp.
mhs
dzieki - faktycznie klucze musza byc na polach indeksowanych.
co do drugiego pytania to sam sobie odpowiedzialem przygladajac sie MySQL'owi w jaki sposb zapisuje dane do tabel

mam jeszcze jedno pytanie odnosnie definiowania relacji pomiedzy tabelami

mam nastepujacy uklad tabel:


[sql:1:7c30225d29]
#tabela podstawowa
CREATE TABLE pracownicy (
id_prac INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
opis CHAR(10) NOT NULL) Type= InnoDB;

#tabela zwiazana
CREATE TABLE wykladowcy (
id_prac INT UNSIGNED NOT NULL PRIMARY KEY,
wyklad char(10) NOT NULL) Type = InnoDB;

ALTER TABLE pracownicy ADD INDEX (id_prac);
[/sql:1:7c30225d29]

czy te dwa zapisy sa sobie rownowazne? w ogole w jaki sposob powinienem poprawnie zdefiniowac relacje (1-1, 1-n) pomiedzy tymi tabelami?
zapis 1:
[sql:1:7c30225d29]
ALTER TABLE wykladowcy ADD FOREIGN KEY (id_prac) REFERENCES pracownicy (id_prac) ON DELETE CASCADE ON UPDATE CASCADE ;
[/sql:1:7c30225d29]

zapis 2:
[sql:1:7c30225d29]
ALTER TABLE wykladowcy ADD CONSTRAINT r1 FOREIGN KEY (id_prac) REFERENCES pracownicy(id_prac) ON DELETE CASCADE ON UPDATE CASCADE ;[/sql:1:7c30225d29]

mam tez jeszcze jedno pytanie: w jaki sposob definiowac stopien uczestnicwa tabel w relacjach? czy w MySQL'u moge okreslic min i max liczbe rekordow w jednej tabeli ktore mozna powiazac z rekordami w drugiej tabeli?

dzieki za informacje
adwol
Cytat
czy te dwa zapisy sa sobie rownowazne?

Tak. Z tego co pamiętam to w MySQLu każde ograniczenie (constraint) może mieć opcjonalną nazwę.
Cytat
w ogole w jaki sposob powinienem poprawnie zdefiniowac relacje (1-1, 1-n) pomiedzy tymi tabelami?

Relacje między tabelami określają dane w nich zawarte, a nie definicja tabel. Możesz nie mieć żadnych kluczy, indeksów czy ograniczeń i mieć relację 1:n. Klucze i ograniczenia pilnują tylko porządku w danych.

Dla relacji 1:n wystarczy jak założysz klucz obcy na odpowiedniej kolumnie w dowiązanej tabeli, a dla 1:1 dodatkowo na tej kolumnie zrobisz unikalny indeks.

Pamiętaj tylko, że relacje 1:1 występują bardzo rzadko, a jeśli już to są one przeważnie podyktowane względami wydajnościowymi. Najczęsciej istnienie relacji 1:1 świadczy o złym zaprojektowaniu schematu bazy.
Cytat
mam tez jeszcze jedno pytanie: w jaki sposob definiowac stopien uczestnicwa tabel w relacjach? czy w MySQL'u moge okreslic min i max liczbe rekordow w jednej tabeli ktore mozna powiazac z rekordami w drugiej tabeli?

Nie spotkałem się z takim czymś i sądzę, że raczej nie ma takiego czegoś, ale sprawdź w dokumentacji bo do MySQLa czasami developerzy wsadzają dziwne rzeczy. smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.