Ограничение внешнего ключа MySQL - столбец целых чисел - PullRequest
9 голосов
/ 29 октября 2010

У меня есть целочисленный столбец, в который я хотел бы добавить ограничение внешнего ключа. Единственная проблема заключается в том, что если в этом столбце нет / нужно значение, по умолчанию MySQL устанавливает значение «0». Это, очевидно, нарушает ограничение внешнего ключа, поскольку в первичной таблице нет записи с PK, равным 0.

Как мне преодолеть эту проблему?

Ответы [ 3 ]

8 голосов
/ 29 октября 2010

Возможно, вы захотите настроить внешний ключ для принятия значений NULL и использовать NULL вместо значения 0.

Концептуально, NULL означает , пропущенное неизвестнозначение .Если ваша строка «не имеет / не нуждается в значении», я считаю, что NULL идеально подходит.

И да, значение NULL не нарушит ограничения внешнего ключа.

Давайте создадим простой пример:

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;

Тогда:

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)
2 голосов
/ 29 октября 2010

Тем не менее, думаю долго и трудно о разрешении этого столбца FK быть нулевым.Нуль означает, что вы можете иметь дочернюю запись без родителя.Это действительно правильный бизнес-кейс?Можете ли вы привести пример, где это действительно?

Кроме того, нулевой FK (или любой пустой столбец) означает, что вы сейчас делаете предположения о том, что означает нулевой.Как вы скажете, если поле действительно не должно иметь значение, по сравнению с кем-то, кто забыл ввести значение?Вы можете реализовать логику Not Null в приложении и обойти проблему таким образом, хотя это по-прежнему сопряжено с риском.Лучше, чем мои, сказали, что пустые значения приводят к менее стабильному дизайну базы данных.YMMV.Возможно, рассмотрим значение по умолчанию, например -1, которое по-прежнему вызывает ненулевой FK и ищет фиктивную запись.

1 голос
/ 29 октября 2010

Возможно, разрешите пустые значения в столбце внешнего ключа и установите значение по умолчанию, равное нулю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...