SQL- ON DELETE

  1. ON DELETE 語法
    1. 1. ON DELETE CASCADE
    2. 2. ON DELETE SET NULL
    3. 3. ON DELETE RESTRICT
    4. 4. ON DELETE NO ACTION
    5. 5. ON DELETE SET DEFAULT

ON DELETE 語法

當設計資料庫時,可以使用不同的外鍵約束選項來控制當父表中的記錄被刪除或更新時,子表中的相關記錄如何處理。以下是每個外鍵約束選項的範例:

1. ON DELETE CASCADE

當父表中的記錄被刪除時,自動刪除子表中所有相關聯的記錄。

CREATE TABLE admin (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    password VARCHAR(60) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE admin_profiles (
    admin_id INT PRIMARY KEY,
    email VARCHAR(100) UNIQUE,
    phone VARCHAR(20),
    FOREIGN KEY (admin_id) REFERENCES admin(id) ON DELETE CASCADE
);

2. ON DELETE SET NULL

當父表中的記錄被刪除時,子表中外鍵欄位的值會被設置為 NULL。

CREATE TABLE admin (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    password VARCHAR(60) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE admin_profiles (
    admin_id INT PRIMARY KEY,
    email VARCHAR(100) UNIQUE,
    phone VARCHAR(20),
    FOREIGN KEY (admin_id) REFERENCES admin(id) ON DELETE SET NULL
);

注意:admin_id 欄位必須允許 NULL 值,否則 ON DELETE SET NULL 會引發錯誤。

ALTER TABLE admin_profiles MODIFY admin_id INT NULL;

3. ON DELETE RESTRICT

防止刪除父表中的記錄,當子表中存在引用該記錄的記錄時。這是默認行為,如果沒有指定 ON DELETE 選項,則會自動使用 RESTRICT。

CREATE TABLE admin (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    password VARCHAR(60) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE admin_profiles (
    admin_id INT PRIMARY KEY,
    email VARCHAR(100) UNIQUE,
    phone VARCHAR(20),
    FOREIGN KEY (admin_id) REFERENCES admin(id) ON DELETE RESTRICT
);

4. ON DELETE NO ACTION

RESTRICT 類似,NO ACTION 不執行任何操作,當外鍵約束被檢查時,如果存在違規,會引發錯誤。實際上,NO ACTIONRESTRICT 的行為是相同的。

CREATE TABLE admin (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    password VARCHAR(60) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE admin_profiles (
    admin_id INT PRIMARY KEY,
    email VARCHAR(100) UNIQUE,
    phone VARCHAR(20),
    FOREIGN KEY (admin_id) REFERENCES admin(id) ON DELETE NO ACTION
);

5. ON DELETE SET DEFAULT

當父表中的記錄被刪除時,子表中外鍵欄位的值會被設置為預設值。

CREATE TABLE admin (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    password VARCHAR(60) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE admin_profiles (
    admin_id INT DEFAULT 0,
    email VARCHAR(100) UNIQUE,
    phone VARCHAR(20),
    PRIMARY KEY (admin_id),
    FOREIGN KEY (admin_id) REFERENCES admin(id) ON DELETE SET DEFAULT
);

注意:admin_id 欄位需要設置預設值,否則 ON DELETE SET DEFAULT 會引發錯誤。

ALTER TABLE admin_profiles MODIFY admin_id INT DEFAULT 0;

總結

  • ON DELETE CASCADE:刪除父表記錄時,自動刪除所有相關的子表記錄。
  • ON DELETE SET NULL:刪除父表記錄時,將子表中的外鍵欄位設為 NULL
  • ON DELETE RESTRICT:防止刪除父表記錄,若子表中存在相關記錄。
  • ON DELETE NO ACTION:與 RESTRICT 類似,但檢查是在 SQL 語句被執行時進行。
  • ON DELETE SET DEFAULT:刪除父表記錄時,將子表中的外鍵欄位設為預設值。

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以邮件至 kimfei2014@gmail.com
github