2017-06-17 77 views
-1

假設:如何使用主鍵刪除表中的一行,而不刪除其他表的值外鍵?

CREATE TABLE Client(
ID_Client int primary key, 
Name varchar(20)); 

CREATE TABLE Sale(
X int primary key, 
ID_Client int REFERENCES Client(ID_Client)); 

INSERT INTO Client VALUES(123456, 'Sam'); 

INSERT INTO Sale VALUES(1, 123456); 

如何刪除「薩姆」不刪除買賣,又不失它的FK值?

+1

你能澄清一下你的意思嗎?「不失去它的FK值」?你想保留'1'還是'123456'? – Mureinik

+0

刪除外鍵約束? – zerkms

+0

在你的例子中,'刪除'Sam'而不刪除銷售,並且不丟失它的FK值'意味着你只需要更新Sam的名字 –

回答

0

通過ID_Client REFERENCES Client引入的外鍵就是禁止該ID_Client需要在未包含在Client值。因此,您無法刪除客戶記錄Sam,而無需先刪除Sale記錄或將相應銷售記錄的client_id更改爲指向其他內容。

如果你想保存銷售記錄,你可以寫ID_Client REFERENCES Client(ID_Client) ON DELETE SET NULL,使得數據庫管理系統將在任何從記錄糾正(已刪除)主數據引用和從記錄的ID_Client - 值設置爲NULL。當然,您將丟失(刪除的)客戶記錄的ID爲123456的信息,因爲此時不再是「有效」參考,因此不應出現在從屬記錄中。

如果您還想保留值123456,則必須刪除外鍵約束。請注意,您仍然可以加入客戶和銷售;但DBMS不能確保您的參照完整性。你必須自己檢查一下。

0

您可以放棄外鍵約束ALTER TABLE Sale DROP CONSTRAINT ...,然後您可以刪除該行...但存在一致性問題,因爲您可以銷售引用未知客戶端。

0
  1. 您不能擁有外鍵引用,並且沒有REFERENCED表中的鍵。 您可以刪除FK參考並使用'Sam'刪除該行。
  2. 如果你想保持約束,並且基本沒有'Sam',那麼在'Sam'的位置插入NULL。