【问题标题】:actual working of primary, foreign key and unique constraint , order/steps of their working主键、外键和唯一约束的实际工作,它们的工作顺序/步骤
【发布时间】:2011-03-28 05:46:34
【问题描述】:

主键、外键和唯一约束如何工作?我的意思是按什么顺序?

比如,当一个子表有一个 FK,并且插入了一条记录,该记录在父表中不存在,那么这条记录是否首先插入到子表中,然后在父表中进行约束检查如果这条记录存在与否,如果它没有找到它,那么它会回滚并从子表中删除该记录。这是工作顺序吗?

或者,首先 SQL 从插入查询中获取记录(在其上创建 FK),并将其与父表记录匹配,并在未找到匹配记录时停止插入,而插入本身并没有t 在子表中插入行?

同理,对于主键,如果表中插入了重复记录,那么是先插入再检查还是先插入再匹配已有记录,如果是重复记录,则查询为停止了。

【问题讨论】:

    标签: sql sql-server-2005 foreign-keys primary-key unique-constraint


    【解决方案1】:

    从逻辑上讲,所有约束都应该同时针对 UPDATE、INSERT 或 DELETE 语句的整个结果进行检查。对约束进行评估,就好像对所有行的修改已经发生一样,如果违反任何约束,则不允许修改。

    【讨论】:

    • 先生,你的意思是什么,我无法理解我的帖子,我的意思是执行顺序是什么?是先插入数据再检查还是先检查再插入?
    【解决方案2】:

    您需要基本的 rdbms 参考。这是免费资源:http://msdn.microsoft.com/en-us/library/aa933098%28v=SQL.80%29.aspx

    【讨论】:

    • 先生,为什么 primary 不允许 NULL 值?
    • 如果以前存在NULL值,那么PK会停止插入另一个NULL,从而工作成功,那为什么不允许NULL值呢?
    • @sqlchild:可能是因为键必须是的基本思想。 (在这种情况下,NULL 被认为是一个非值。)
    • 因为键是一组包含一组唯一值的属性,而空值不是值。将空值视为唯一性约束中的等效值的做法是 SQL Server DBMS 系列的一个独特功能。其他 DBMS 不这样做。可空的唯一约束通常最好完全避免——它们并没有多大意义。
    【解决方案3】:

    考虑TRIGGER 可以访问的逻辑(概念)表deletedinserted。甚至这些也只是概念。谁知道幕后发生了什么? ...好吧,肯定有人知道...但是您关心幕后发生了什么吗?在概念层面,它要么成功,要么失败,或者您可以在触发器中操纵结果。你还需要知道什么? ;)

    【讨论】:

    • 实际上在某些情况下事情并不那么简单,了解幕后发生的事情很有用。例如,SQL Server 将在其他约束之前评估一些约束,并且只返回一个错误而不是所有错误。 CHECK 约束也是逐行评估的,而不是基于集合的。如果您有复杂的代码访问 CHECK 约束中的多行,这可能会导致一些令人讨厌的问题。
    • @dportas:确实,我在这里读到了这些问题(consultingblogs.emc.com/davidportas/archive/2007/02/19/…)——唯一的评论是我的:) 但是,在 OP 的情况下,我将建议打赌,“相信引擎” 是所有应得的:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多