2010-10-28 10 views
8

Ich habe eine Integerspalte, der ich eine Fremdschlüsseleinschränkung hinzufügen möchte. Das einzige Problem ist, wenn diese Spalte keinen Wert hat/braucht, MySQL schreibt standardmäßig einen '0' Wert. Dies bricht offensichtlich die Fremdschlüsseleinschränkung, da es in der Primärtabelle keinen Datensatz mit einem PK von 0 gibt.MySQL Fremdschlüsseleinschränkung - Ganzzahl Spalte

Wie kann ich dieses Problem beheben?

Antwort

7

Sie können Ihren Fremdschlüssel so einstellen, dass er Werte von NULL akzeptiert, und einen NULL anstelle eines 0 Wertes verwenden.

Konzeptionell bedeutet NULL eine fehlenden unbekannten Wert. Wenn Ihre Zeile "den Wert nicht hat/braucht", glaube ich, dass ein NULL perfekt passt.

Und ja, ein NULL Wert würde nicht brechen Ihre Fremdschlüssel Einschränkung.

Lassen Sie sich ein einfaches Beispiel bauen:

CREATE TABLE parents (
    id  int PRIMARY KEY, 
    value int 
) ENGINE = INNODB; 

CREATE TABLE children (
    id   int PRIMARY KEY, 
    parent_id int, 
    FOREIGN KEY (parent_id) REFERENCES parent (id) 
) ENGINE = INNODB; 

Dann:

INSERT INTO parents VALUES (1, 100); 
Query OK, 1 row affected (0.00 sec) 

INSERT INTO children VALUES (1, 1); 
Query OK, 1 row affected (0.00 sec) 

INSERT INTO children VALUES (2, 0); 
ERROR 1452 (23000): A foreign key constraint fails 

INSERT INTO children VALUES (2, NULL); 
Query OK, 1 row affected (0.00 sec) 

SELECT * FROM children; 
+----+-----------+ 
| id | parent_id | 
+----+-----------+ 
| 1 |   1 | 
| 2 |  NULL | 
+----+-----------+ 
2 rows in set (0.01 sec) 
1

Vielleicht nulls in Ihrer Fremdschlüsselspalte ermöglichen und den Standard auf null gesetzt.

2

Denken Sie jedoch lang und hart darüber zu erlauben, dass FK-Spalte Null sein. Null bedeutet, dass Sie eine Kinderakte ohne Eltern haben können. Ist das wirklich ein gültiger Business Case? Können Sie ein Beispiel geben, wo dies gilt?

Außerdem bedeutet ein Null-FK (oder eine beliebige Nullspalte), dass Sie jetzt Annahmen darüber treffen, was der Nullwert bedeutet. Wie sagst du, ob das Feld wirklich keinen Wert haben soll, während jemand vergisst, einen Wert einzugeben? Sie können Not-Null-Logik in der App implementieren und das Problem auf diese Weise umgehen, obwohl dies immer noch mit Risiken verbunden ist. Bessere Köpfe als meine haben gesagt, dass das Erlauben von Nullen zu einem weniger stabilen Datenbankdesign führt. YMMV. Betrachten Sie vielleicht einen Standardwert wie -1, der immer noch einen nicht null FK erzwingt und nach einem Dummy-Datensatz sucht.

Verwandte Themen