5 Stimmen

Eins-zu-eins-Beziehung in MySQL

Ich versuche, eine Eins-zu-eins-Beziehung in einer MySQL-DB zu erstellen. Ich verwende die InnoDB-Engine und die Basistabelle sieht wie folgt aus:

CREATE TABLE `foo` (
  `fooID` INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `name` TEXT NOT NULL
)

CREATE TABLE `bar` (
  `barName` VARCHAR(100) NOT NULL,
  `fooID` INT(11) NOT NULL PRIMARY KEY,
  CONSTRAINT `contact` FOREIGN KEY (`fooID`) REFERENCES `foo`(`fooID`)
)

Wenn ich diese nun eingerichtet habe, ändere ich die Tabelle foo so, dass die fooID auch ein Fremdschlüssel für die fooID in bar wird. Das einzige Problem, mit dem ich konfrontiert bin, ist, dass es ein Integritätsproblem geben wird, wenn ich versuche, in eine der beiden Tabellen einzufügen. Ich bitte um Hilfe, danke.

4voto

Chris Shaffer Punkte 31499

Eine echte Eins-zu-eins-Beziehung in einer relationalen Datenbank wird am besten durch Hinzufügen einer Spalte hergestellt. Wenn die Daten in diesen beiden Tabellen immer für jeden Datensatz benötigt werden, dann sollte die Tabelle als foo (fooID, name, barname) definiert werden.

1voto

Maciej Piechotka Punkte 6758

Sie können die Prüfung der Einschränkung auf das Ende der Transaktion verschieben. Ich habe jedoch nichts für MySQL gefunden (es ist nicht die fortschrittlichste Datenbank). Für PostgreSQL (für andere variiert die Syntax):

ALTER TABLE foo ADD FOREIGN KEY (fooID) REFERENCES bar DEFERRABLE;

Das bedeutet, dass die Einschränkung am Ende der Transaktion überprüft wird.

Wenn Sie MySQL verwenden müssen, verwenden Sie die Antwort von Chris Shaffer.

0voto

Botto Punkte 1158

Ich habe einen " Hacky "Lösung für dieses Problem: die Variable fremdschlüssel_checks verwendet werden können.

Wenn man die fooID in foo so ändert, dass sie eine Fremdschlüssel-Beschränkung in bar hat, kann man das dann so einfügen

SET foreign_key_checks = 0;
INSERT...;
INSERT...;
SET foreign_key_checks = 1;

Wie ich schon sagte " Hacky "und ich würde dies wahrscheinlich nicht auf einem Produktionssystem tun.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X