MySQL 級聯刪除

Rashmi Patidar 2022年5月13日
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 位元組的資料型別,用於儲存學生姓名。

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

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

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

    例子:

    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 屬性摺疊第三條記錄。該屬性是參照完整性約束屬性,當父表受到影響時,它會刪除子表中的記錄。

作者: Rashmi Patidar
Rashmi Patidar avatar Rashmi Patidar avatar

Rashmi is a professional Software Developer with hands on over varied tech stack. She has been working on Java, Springboot, Microservices, Typescript, MySQL, Graphql and more. She loves to spread knowledge via her writings. She is keen taking up new things and adopt in her career.

LinkedIn

相關文章 - MySQL Delete