Ограничение внешнего ключа автоматически запрещает нули? - PullRequest
3 голосов
/ 21 марта 2012

В моей таблице действий у меня есть поле StaffId. Это FK таблицы Staff (которая содержит StaffId). При вставке данных в таблицу «Действия» - если значение StaffId равно нулю, возникает ошибка ограничения FK !? Я поставил галочку в поле «Alllow Nulls» в SSMS, так почему это не так?

Обратите внимание, эта запись вставляется с помощью метода DbCommand.ExecuteNonQuery.

Также обратите внимание: я только что выполнил инструкцию Insert, используя SSMS для вставки значений NULL, и это сработало. Может быть, это более специфичный для C # вопрос!?

Ответы [ 2 ]

3 голосов
/ 21 марта 2012

Нет, посмотрите на это http://msdn.microsoft.com/en-us/library/ms175464.aspx

Ограничение FOREIGN KEY не должно быть связано только с ограничением PRIMARY KEY в другой таблице;он также может быть определен для ссылки на столбцы ограничения UNIQUE в другой таблице.Ограничение FOREIGN KEY может содержать нулевые значения;однако, если какой-либо столбец составного ограничения FOREIGN KEY содержит нулевые значения, проверка всех значений, составляющих ограничение FOREIGN KEY, пропускается.Чтобы убедиться, что все значения составного ограничения FOREIGN KEY проверены, укажите NOT NULL для всех участвующих столбцов.

, вы можете увидеть другой пример в MySql, посмотрите следующую ссылку http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html
Вы можете видеть, что можно установить SET NULL

SET NULL: удалить или обновить строку из родительской таблицы и задать для столбца или столбцов внешнего ключа в дочерней таблице значение NULL.Это допустимо, только если в столбцах внешнего ключа не указан спецификатор NOT NULL.Поддерживаются оба предложения: ON DELETE SET NULL и ON UPDATE SET NULL.

Если вы указали действие SET NULL, убедитесь, что вы не объявили столбцы в дочерней таблице как NOT NULL.

1 голос
/ 21 марта 2012

Это можно сделать на БД, как продемонстрировал @Martin.Проблема в вашем клиенте.У DbCommand есть проблемы, связанные с NULL, это одна из причин, по которой они создали Linq To Sql.

Я предлагаю вам попробовать что-то вроде этого:

if(parameter_is_not_null)
      db.AddInParameter(dbCommand, "staffId", DbType.String, staffId.Text);
else
      db.AddInParameter(dbCommand, "staffId", DbType.String, DBNull.Value);
...