[英]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个选项(无操作,级联,设置为空,设置为默认)
S(5,13)
将删除R(1,5)
,删除S(4,12)
将删除R(0,4)
。 Null
。 在您的情况下,删除S(5,13)
会将R(1,5)
更新为R(1,Null)
,删除S(4,12)
会将R(0,4)
更新为R(0,Null)
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
上具有外键约束。
由于主键约束,如果你尝试,你会收到一条错误INSERT
到S
与值C
已经存在。
检查您的INSERT
语句,以查看是否有任何试图插入C
的值已经存在。 如果这样做,他们将失败。
给定外键约束,如果您尝试从S
删除表R
上外键约束已引用的C
任何值,则会收到错误消息。
检查您的DELETE
语句。 如果R
中已经引用了任何要删除的值,则这些语句将失败。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.