【问题标题】:Does a foreign key constraint automatically disallow nulls?外键约束是否自动禁止空值?
【发布时间】:2012-03-21 08:53:31
【问题描述】:

在我的活动表中,我有一个 StaffId 字段。这是 Staff 表的 FK(包含 StaffId)。在将数据插入活动表时 - 如果 StaffId 为空,则会引发 FK 约束错误!?我在 SSMS 中勾选了“允许 Nulls”框,为什么不是这样?

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

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

【问题讨论】:

  • 是的,如果列对于可选关系可为空,则 FK 确实允许 NULL。确定是它抱怨的 FK 吗?
  • 我记得 fk 列可能为空,可能是由于 SSMS 的限制?
  • FK_Activities_Staff - 它是任何其他桌子上唯一的 FK。这让我很困惑。

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


【解决方案1】:

不,看看这个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。

【讨论】:

  • 为什么“不”?您引用的段落说“是”!
  • @MartinSmith 和另一个 +1 他:我的报价包含:“外键约束可以包含空值”所以它怎么说是?请删除您的评论
  • @MartinSmith:嗯,问题是“外键约束会自动禁止空值吗?”答案是“否”,因为“外键约束可以包含空值”。为什么应该是“是”?这没有任何意义......
  • @MartinSmith:这就是我说“再读一遍”时的意思:-)
  • 这根本不能解决 C# 问题。如果数据库是 SQl Server,为什么还要提供 mySQL 示例?
【解决方案2】:

正如@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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-14
    • 2018-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    相关资源
    最近更新 更多