外键约束是否会自动禁止空值?

时间:2012-03-21 08:53:31

标签: sql sql-server c#-4.0 foreign-keys foreign-key-relationship

在我的活动表中,我有一个StaffId字段。这是Staff表的FK(包含StaffId)。在将数据插入Activities表时 - 如果StaffId为null,则抛出FK约束错误!?我已经勾选了SSMS中的'Alllow Nulls'框,为什么不是这样呢?

注意,此记录是通过DbCommand.ExecuteNonQuery方法插入的。

另请注意:我刚刚使用SSMS运行了一个Insert语句来插入NULL值,并且它有效。可能这是一个更具C#的问题!?

2 个答案:

答案 0 :(得分:3)

不,请看这个http://msdn.microsoft.com/en-us/library/ms175464.aspx

  

FOREIGN KEY约束不必仅链接到PRIMARY   另一个表中的KEY约束;它也可以定义为参考   另一个表中的UNIQUE约束的列。一把外国钥匙   约束可以包含空值;但是,如果有任何一列   复合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 :(得分:1)

可以在@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);