約束:數據庫完整性

開放

數據庫完整性控制

了解數據庫的另一件重要事情是 CONSTRAINS。在約束的幫助下,您可以控製表中的數據更改並保持它們的完整性和一致性。

當我們談論數據庫時,什麼是數據一致性?

讓我們以帶有員工、產品和任務表的在線商店為例。我們已經知道任務表中可能存在未分配給任何人的任務:此類行的 employee_id為 NULL。

但是如果任務表中有一個條目的 employee_id 等於,比方說,115,會發生什麼?畢竟,我們沒有這樣的員工。employee 表中沒有 id = 115 的員工。同時,任務表中有指向具有此 ID 的員工的鏈接。這是一個數據不一致的例子。

那麼我們如何協調這些數據呢?理想情況下,SQL 服務器可以在任何數據更改時控制所有這些細微差別。而有這樣一個機會,它叫做FOREIGN_KEY。

如果表中的某些列不僅包含數字,還包含來自另一個表的 id 行,則可以明確指定。

添加外鍵

這樣的鍵可以在創建階段和之後使用 ALTER TABLE 添加到表中。格式沒有根本的不同。我們將介紹這兩種選擇。

這種鍵/規則的一般形式是:

FOREIGN KEY (column)
  	REFERENCES table(column)

讓我們將此鍵/規則添加到任務表中,以確保表中的所有employee_id都引用員工表中的現有條目。該腳本將如下所示:

ALTER TABLE task
      ADD FOREIGN KEY (employee_id)
  	REFERENCES employee(id)

如果我們決定在創建任務表時添加這條規則,那麼代碼將如下所示:

CREATE TABLE task (
      id INT,
      name VARCHAR(100),
      employee_id INT,
      deadline DATE,
 
      PRIMARY KEY (id),
  	  FOREIGN KEY (employee_id)  
	      REFERENCES employee(id)
);

順便說一句,在某些情況下,我們引用的字符串具有唯一的複合鍵:例如,“姓名和出生年份”或“productCatogoryId 和 productId”。那麼FOREIGN KEY可以這樣寫:

FOREIGN KEY (our_column1, our_column2)
  	REFERENCES table(their_column1, their_column2)

外鍵和更改數據

現在想像一下我們決定更新員工表中的一些數據並且我們的員工 ID 發生變化的情況。任務表中的數據會發生什麼變化?沒錯,它們將變得無關緊要,我們數據庫的完整性將受到侵犯。

為防止這種情況發生,您可以告訴 SQL Server 在 employee 表中的 id 更改時更改所有表中引用此特定已更改 id 的所有行的 employee_id。

此類腳本稱為OnUpdateOnDelete。記錄id改變了怎麼辦,記錄被刪除了怎麼辦?

隨著刪除,並非一切都那麼簡單。如果數據庫中有由字符串表示的相互引用的依賴對象,則在刪除一個對象時可能會出現多種行為場景。

假設我們刪除了一個網站用戶,這意味著我們必須刪除他所有的個人信件。但我們不太可能刪除他所有的公開評論。

或者員工離職。如果他辭職了,同時分配給他的所有任務都從數據庫中消失了,那才奇怪。但如果他們不是由他任命,結果也會很糟糕。更正確的做法是讓員工在將所有任務重新分配給其他人後可以辭職。

以下是我們如何使用 FOREIGN KEY 描述這些場景。這種鍵/規則的一般形式是:

FOREIGN KEY (column)
  	REFERENCES table(column)
 	[ON DELETE reference_option]
 	[ON UPDATE reference_option]

如果刪除(ON DELETE)或更改(ON UPDATE)記錄怎麼辦?SQL 服務器總共可以有 5 個選項來處理這些情況中的每一個:

# 參考選項 解釋
1個 限制 如果找到字符串引用則禁用操作
2個 級聯 更改依賴行中的 id
3個 設置為空 將依賴行中的 id 設置為 NULL
4個 無動作 沒事做
5個 設置默認 x 將依賴匯中的 id 設置為 x

下面是我們如何修改我們的任務表:

ALTER TABLE task
  	ADD FOREIGN KEY (employee_id)
  	REFERENCES employee(id)
  	ON UPDATE CASCADE
  	ON DELETE RESTRICT;

這裡寫了什麼:

ON UPDATE CASCADE:如果 employee 表中的 id 鍵發生變化,則也更改引用它的任務表中的 employee_id 。

ON DELETE RESTRICT:如果正在從員工表中刪除一行並從任務表中引用該行,則防止從員工表中刪除該行。

留言
  • 受歡迎
你必須登入才能留言
此頁面尚無留言