Fremdschlüssel und NULL-Werte in Datenbanktabellenspalten
Beim Datenbankdesign werden häufig Fremdschlüsseleinschränkungen verwendet, um die Datenintegrität sicherzustellen, indem Beziehungen zwischen Tabellen erzwungen werden. Es stellt sich jedoch die Frage: Dürfen Tabellenspalten mit Fremdschlüsseln NULL-Werte enthalten?
Wie in der bereitgestellten Frage gezeigt, kann es Situationen geben, in denen Fremdschlüsseleinschränkungen nur erzwungen werden müssen, wenn der Wert explizit festgelegt wird. Dadurch können Datensätze mit NULL-Werten zunächst in Fremdschlüsselspalten eingefügt werden, während die Datenintegrität nach dem Auffüllen der Werte gewährleistet wird.
In MySQL- und InnoDB-Tabellentypen ist es tatsächlich möglich, Fremdschlüssel ungleich NULL zu haben, die NULL-Werte zulassen. Das folgende Beispiel zeigt dies:
CREATE DATABASE t; USE t; CREATE TABLE parent (id INT NOT NULL, PRIMARY KEY (id) ) ENGINE=INNODB; CREATE TABLE child (id INT NULL, parent_id INT NULL, FOREIGN KEY (parent_id) REFERENCES parent(id) ) ENGINE=INNODB;
Zulassen, dass Datensätze, bei denen parent_id
NULL ist, in die child
-Tabelle eingefügt werden:
INSERT INTO child (id, parent_id) VALUES (1, NULL);
Der Versuch, einen Datensatz einzufügen, dessen parent_id
-Wert nicht in der parent
-Tabelle vorhanden ist, führt jedoch zu einer Verletzung der Fremdschlüsseleinschränkung:
INSERT INTO child (id, parent_id) VALUES (2, 1); -- ERROR 1452 (23000): Cannot add or update a child row: a foreign key -- constraint fails (`t/child`, CONSTRAINT `child_ibfk_1` FOREIGN KEY -- (`parent_id`) REFERENCES `parent` (`id`))
Dieses Verhalten bestätigt, dass MySQL und InnoDB NULL-Werte für Fremdschlüsselspalten zulassen und Einschränkungen nur erzwingen, wenn ein Nicht-NULL-Wert bereitgestellt wird. Dies steht im Einklang mit der Erwartung, dass Fremdschlüsseleinschränkungen erzwungen werden sollten, wenn die Fremdschlüsselspalte mit Daten gefüllt wird, während gleichzeitig anfängliche NULL-Werte in der Fremdschlüsselspalte zugelassen werden.
Das obige ist der detaillierte Inhalt vonKönnen Fremdschlüsselspalten NULL-Werte in MySQLs InnoDB akzeptieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!