我有创建两个表的说明:
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
我很难回答这个问题,因为我相信所有选项都会被拒绝。
由于c是主键,所以无法将(3, 3)
或(4, 4)
插入S
中,因此我无法插入将在c中重复的值。
而且我无法从(5, 13)
中删除(4, 12)
或S
,因为如果删除了这些行,则表R
中的b列指向c列。指向不存在的东西会导致错误。
我想念什么吗?
答案 0 :(得分:0)
由于您提到的原因,陈述(a)和(b)一定会失败 “他们正在尝试创建重复的主键”
但是,对于语句(c)和(d),它们可能成功或失败,具体取决于您的参照完整性配置,如下所示:
引用完整性具有4个选项(无操作,级联,设置为空,设置为默认)
Check how to configure referential integrity
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)
答案 1 :(得分:0)
我猜这是某种形式的考试问题,所以我将重点放在如何得出答案上,而不仅仅是给您答案。
您要注意两个约束。
表S
在列C
上具有主键约束。表R
在列B
上具有外键约束。
鉴于主键约束,如果您尝试INSERT
进入S
且值为C
的情况下将收到错误消息。
检查您的INSERT
语句,以查看是否有任何试图插入C
的值。如果这样做,它们将失败。
鉴于外键约束,如果您尝试从S
删除表C
上的外键约束已引用的R
的任何值,则会收到错误消息。
检查您的DELETE
语句。如果R
中已引用了任何要删除的值,则这些语句将失败。