约束违反-SQL Server

时间:2019-01-07 14:01:08

标签: sql sql-server constraints

我有创建两个表的说明:

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列。指向不存在的东西会导致错误。

我想念什么吗?

2 个答案:

答案 0 :(得分:0)

由于您提到的原因,陈述(a)和(b)一定会失败 “他们正在尝试创建重复的主键”

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

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

Check how to configure referential integrity

  1. “不执行任何操作” 表示语句(b)和(c)都将按您的预期失败。
  2. “级联” 是指对引用表进行级联删除操作并删除相关记录。对于您而言,删除S(5,13)将删除R(1,5),而删除S(4,12)将删除R(0,4)
  3. “设置为空” 是指将参考值设置为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)

答案 1 :(得分:0)

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

您要注意两个约束。

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

鉴于主键约束,如果您尝试INSERT进入S且值为C的情况下将收到错误消息。

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

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

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