HOWTO · MySQL

MySQL 級聯刪除

本文介紹 MySQL 中的刪除級聯

在 MySQL 語言中,約束是指在表上強制執行以避免某些異常的一組規則。

這些異常會導致表中出現錯誤記錄。基於故障的行為,約束可以是各種型別。

它們是參照完整性、實體約束和語義約束。這些具有基於故障型別以及如何避免不一致行為的含義和用法。

讓我們簡要了解存在的約束型別。

  1. 實體約束是應用於表中存在的實體和屬性的約束。

    它保持表列中顯示的值的一致性。它通常被稱為第一級驗證,其中保持了列的完整性。

    例子:

    create table student (stu_id int primary key, stu_name varchar2(50), stu_dept varchar2(15));
    Insert into student values(111, 'ABC', 'Chemical');
    

    主鍵 是實體完整性約束,它在內部意味著 stu_id 列是唯一且非空值。stu_id 列中不允許重複,並且不允許非空值。

  2. 語義約束在列上強制執行,以顯示錶中存在的相似資料型別值。它通常在列上強制執行以使值一致並保持特定型別。

    例子:

    Stu_name varchar2(50);
    

    在上面的示例中,varchar2 是容量為 50 位元組的資料型別,用於儲存學生姓名。

    該列僅保留字元型別的值,不允許使用雙精度值和整數值。因此,它是一種語義約束。

  3. 參照完整性是應用於其他表以對資料實施限制的約束。最常用的約束是外來鍵約束。

    如果父表有修改,子表應與父表保持一致。如果是刪除記錄的情況,則子記錄中的引用不應保持懸空,並且是引用完整性約束。

    例子:

    create table report_card (stu_roll_number int, stu_marks int, stu_course varchar2(30) references student);
    

    在上面的示例中,成績單顯示了父表 student 中學生的部門或課程。如果引用完整性約束被應用,那麼一個表中的操作將影響子表中的工作。

在參照完整性約束下,on delete cascade 是參照完整性約束,如果父記錄被刪除,它會自動刪除子記錄。它是對從外來鍵採取的引用動作的響應。

例子:

CREATE TABLE Student (stu_id int(10) NOT NULL, name varchar(10) NOT NULL, birthdate date NOT NULL, PRIMARY KEY (stu_id));

上面的查詢建立了一個表 student,其屬性或列作為學生 ID,int 型別和主鍵作為列的實體約束。其他值屬性包括名稱和生日,其資料型別為 varchardate

CREATE TABLE Department (dept_id int(20) PRIMARY KEY NOT NULL,stu_id int(10) NOT NULL, dept_name varchar(20) NOT NULL, FOREIGN KEY (stu_id) REFERENCES Student (stu_id) ON DELETE CASCADE);

在上面的查詢中,形成了一個部門表,其屬性為 id、部門名稱和學生 id。此外,學生 ID 將充當父表中的引用或外來鍵。

這裡的 on delete cascade 約束說,當學生 id 發生任何刪除時,它從部門表中的條目也將被刪除。因此,刪除後不會有與該系學生對應的條目。

讓我們在表中插入記錄,看看這裡的操作是如何工作的。

首先,在表 Student 中插入記錄。

INSERT INTO Student (stu_id, name, birthdate) VALUES  
(101, 'John', '1995-11-12'),  
(102, 'Jian', '1983-07-19'),  
(103, 'Jackey', '1965-10-23');

上面的查詢將在表 Student 中插入三條記錄。

在表部門中插入記錄。

INSERT INTO Department (dept_id, stu_id, dept_name) VALUES   
(301, 101, 'Physics'),  
(302, 101, 'Science'),  
(303, 102,  'Maths');

上面的查詢將為表部門中的各個學生 ID 插入三個部門。

現在讓我們刪除父表中的一條記錄。

DELETE FROM Student WHERE stu_id = 102; 

最終結果將刪除表部門的第三條記錄,因為其父表的引用被刪除,使第三條記錄懸空。

因此,它使用 on delete cascade 屬性摺疊第三條記錄。該屬性是參照完整性約束屬性,當父表受到影響時,它會刪除子表中的記錄。