繁体   English   中英

约束违反-SQL Server

[英]Constraint violation - SQL Server

我有创建两个表的说明:

CREATE TABLE S
(
    c INT PRIMARY KEY,
    d INT
);

CREATE TABLE R
(
    a INT PRIMARY KEY,
    b INT REFERENCES S(c)
);

R(a,b)有4行: (0,4),(1,5),(2,4),(3,5)

S(c,d)也有4行: (2,10),(3,11),(4,12),(5,13)

考虑到此信息,我需要选择由于约束冲突而不会拒绝以下哪些修改(此处不考虑语法):

查询(a)

INSERT INTO S
VALUES (3, 3)

查询(b)

INSERT INTO S
VALUES (4, 4)

查询(c)

DELETE (5, 13) FROM S

查询(d)

DELETE (4, 12) FROM S

我很难回答这个问题,因为我相信所有选择都会被拒绝。

我无法将(3, 3)(4, 4)插入S因为c是主键,因此我无法插入将在c中重复的值。

而且我无法从S删除(5, 13)(4, 12) ,因为如果删除了这些行,则表R b列指向c列,则b列将指向不存在的东西,这将导致一个错误。

我想念什么吗?

语句(a)和(b)一定会因为您提到“它们试图创建重复的主键”而失败。

但是,对于语句(c)和(d),它们可能成功或失败,具体取决于您的参照完整性配置,如下所示:

参照完整性有4个选项(无操作,级联,设置为空,设置为默认)

检查如何配置参照完整性

  1. “无操作”表示语句(b)和(c)都将按您的预期失败。
  2. “级联”是指对引用表进行级联删除操作并删除相关记录。 在您的情况下,删除S(5,13)将删除R(1,5) ,删除S(4,12)将删除R(0,4)
  3. “设置Null”是指将参考值设置为Null 在您的情况下,删除S(5,13)会将R(1,5)更新为R(1,Null) ,删除S(4,12)会将R(0,4)更新为R(0,Null)
  4. “设置默认值”是指将参考值设置为默认值(如果有的话),或者将其设置为Null如果未定义默认值)。 在您的情况下,由于未设置默认值,它将失败,但是假设您将R(b)默认值设置为0 ,例如删除S(5,13)会将R(1,5)更新为R(1,0)并删除S(4,12)会将R(0,4)更新为R(0,0)

我猜这是某种形式的考试问题,所以我将重点放在如何得出答案上,而不仅仅是给您答案。

您有两个要关注的约束。

S在列C上具有主键约束。 R在列B上具有外键约束。

由于主键约束,如果你尝试,你会收到一条错误INSERTS与值C已经存在。

检查您的INSERT语句,以查看是否有任何试图插入C的值已经存在。 如果这样做,他们将失败。

给定外键约束,如果您尝试从S删除表R上外键约束已引用的C任何值,则会收到错误消息。

检查您的DELETE语句。 如果R中已经引用了任何要删除的值,则这些语句将失败。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM