2008-11-17 13 views
6

Tworzę nową tabelę wewnątrz mysql i próbuję dodać ograniczenie klucza obcego do jednego z pól.Znikające klucze obce w phpMyAdmin

 
CREATE TABLE `onlineorder` (
    `receiptid` varchar(10) NOT NULL default '', 
    `delivereddate` date default NULL, 
    `cid` int(10) NOT NULL, 
    `card#` int(10) default NULL, 
    `expire` date default NULL, 
    PRIMARY KEY (`receiptid`), 
    FOREIGN KEY (receiptid) REFERENCES purchase 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

Jednak po jego utworzeniu przechodzę do phpMyAdmin i eksportuję tabelę. i wydaje się, że zniknęło ograniczenie klucza obcego.

 
CREATE TABLE `onlineorder` (
    `receiptid` varchar(10) NOT NULL default '', 
    `delivereddate` date default NULL, 
    `cid` int(10) NOT NULL, 
    `card#` int(10) default NULL, 
    `expire` date default NULL, 
    PRIMARY KEY (`receiptid`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

Czy phpMyAdmin pozbywa się obcych kluczy lub czy robię coś nie tak?

Odpowiedz

6

Podczas definiowania tabeli z silnikiem przechowywania MyISAM, akceptuje FOREIGN KEY ograniczeń, ale cicho rzuca je. Analizuje je, ale nie zapisuje ograniczenia w metadanych tabeli, a następnie nie może wymusić ograniczenia. Kiedy zapytasz się o koncepcję bazy danych dotyczącą definicji tabeli, nie wie nic o tym ograniczeniu, o czym już wiesz.

To samo dzieje się z ograniczeniami CHECK (niezależnie od mechanizmu składowania); analizuje składnię i akceptuje ją, ale potem ją ignoruje.

IMHO, to jest straszne dla produktu MySQL. Przyjmuje standardowy SQL bez błędu, co sprawia wrażenie, że będzie obsługiwał ograniczenia w standardowy sposób. Ale tak nie jest! Nawet SHOW WARNINGS ujawnia, że ​​MySQL nie uwzględnił ograniczenia.

Jeśli korzystasz z mechanizmu magazynowania InnoDB, przestrzega ograniczenia klucza obcego.

+1

nawet z InnoDB eksport nie zawiera klucz obcy. (dla mnie) – sdfor

+2

ok Rozgryzłem to. w widoku relacji dodałem klucz foriegn w kolumnie relacji wewnętrznych. mój błąd. należy go wpisać w następnej kolumnie. – sdfor

+0

Zgadzam się, to jest okropny sposób, żeby to zakodować. –

1

Ponadto PHPMyAdmin usuwa wyciągi z wszelkich CONSTRAINTS, aż po utworzeniu wszystkich tabel i wstawieniu danych. Jeśli używasz jako PHPMySql do zrzutu tabeli dla ciebie, znajdziesz na końcu pliku sekcję tabeli AKTUALIZACJI z wszystkimi wpisami ADD CONSTRAINT.

0

Istnieją dwa rodzaje ograniczeń podczas zarządzania tabel z phpmyadmin:

  • wewnętrzny: po ustawieniu ograniczenia z projektantem phpmyadmin na przykład ograniczeń zapisanych jako wewnętrzne, które nie będą zawarte w eksporcie.
  • InnoDB: te ograniczenia zawarte w ryzach eksport z połączonego materiału wideo o to

[Video: utworzenie klucza obcego] [1]