簡體   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