SQL 程式札記 : ON DELETE

2023/12/27閱讀時間約 4 分鐘

本文將介紹 SQL 中的 ON DELETE, ON DELETE 是用於管理資料庫中的外鍵約束和相關資料的刪除行為。接下來將教你如何使用 ON DELETE 來保持資料的一致性和完整性。

ON DELETE 語句的種類

ON DELETE語句在定義外鍵約束時使用,指定當被參照表(父表)中的資料被刪除時,應如何處理參照表(子表)中的相關資料。主要有以下幾種類型:

  1. NO ACTION: 這是默認行為。如果父表中的資料被刪除,子表中參照該資料的任何行都會阻止這次刪除。
  2. CASCADE: 當父表中的資料被刪除時,子表中參照該資料的所有行也會被刪除。
  3. SET NULL: 當父表中的資料被刪除時,子表中參照該資料的所有行將其外鍵值設為NULL。

ON DELETE 範例程式

讓我們透過具體的範例程式來瞭解ON DELETE的運作方式。

1.NO ACTION

當嘗試刪除父表中的記錄時,如果還有子表中的行參照該記錄,則操作將失敗。

-- 建立父表和子表
CREATE TABLE class (
classId INT PRIMARY KEY,
className VARCHAR(100)
);

CREATE TABLE student (
studentId INT PRIMARY KEY,
name VARCHAR(100),
classId INT,
FOREIGN KEY (classId) REFERENCES class(classId) ON DELETE NO ACTION
);

-- 插入示例數據
INSERT INTO class (classId, className) VALUES (1, 'Mathematics');
INSERT INTO student (studentId, name, classId) VALUES (101, 'Alice', 1);

-- 嘗試刪除父表中的記錄
DELETE FROM class WHERE classId = 1;

2.CASCADE

當刪除父表中的記錄時,自動刪除子表中所有參照該記錄的行。

-- 建立父表和子表
CREATE TABLE class (
classId INT PRIMARY KEY,
className VARCHAR(100)
);

CREATE TABLE student (
studentId INT PRIMARY KEY,
name VARCHAR(100),
classId INT,
FOREIGN KEY (classId) REFERENCES class(classId) ON DELETE CASCADE
);

-- 插入示例數據
INSERT INTO class (classId, className) VALUES (2, 'Science');
INSERT INTO student (studentId, name, classId) VALUES (102, 'Bob', 2);

-- 刪除父表中的記錄,並觀察子表的變化
DELETE FROM class WHERE classId = 2;

3.SET NULL

當父表中的記錄被刪除時,子表中所有參照該記錄的行將其外鍵值設為NULL。

-- 建立父表和子表
CREATE TABLE class (
classId INT PRIMARY KEY,
className VARCHAR(100)
);

CREATE TABLE student (
studentId INT PRIMARY KEY,
name VARCHAR(100),
classId INT,
FOREIGN KEY (classId) REFERENCES class(classId) ON DELETE SET NULL
);

-- 插入示例數據
INSERT INTO class (classId, className) VALUES (3, 'History');
INSERT INTO student (studentId, name, classId) VALUES (103, 'Charlie', 3);

-- 刪除父表中的記錄,並觀察子表的變化
DELETE FROM class WHERE classId = 3;

😊 感謝你的耐心閱讀,若是你喜歡這篇內容,可以透過以下方式表達你的喜歡 😊

❤️按個愛心|💬留言互動|🔗分享此文|📌追蹤阿梧|☕請喝咖啡

51會員
82內容數
「梧笙」即「吾生」,意即我的生命,朋友都叫我「阿梧(Awu)」,高雄人。我喜歡學習新技能,從程式設計到網路工具,再到社群經營和影片剪輯。日常興趣是打遊戲、看動漫、讀小說和聽音樂。我會把這些興趣寫成文章,如果你有任何想法或問題,歡迎來信到我的郵箱 [email protected]
留言0
查看全部
發表第一個留言支持創作者!