HOWTO · MySQL

MySQL カスケード削除

この記事では、MySQL の削除カスケードについて紹介します

このページの内容

MySQL 言語では、制約は、いくつかの異常を回避するためにテーブルに適用される一連のルールを指します。

これらの異常により、テーブルに誤ったレコードが作成されます。制約は、障害の動作に基づいてさまざまなタイプにすることができます。

これらは、参照整合性、エンティティ制約、およびセマンティック制約です。これらには、障害のタイプと、一貫性のない動作を回避する方法に基づいた意味と使用法があります。

存在する制約のタイプを簡単に理解しましょう。

  1. エンティティ制約は、テーブルに存在するエンティティと属性に適用される制約です。

    これは、テーブルの列内に表示される値の一貫性を維持します。これは、カラムの完全性が維持される第 1 レベルの検証としてよく知られています。

    例:

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

    primary key はエンティティの整合性制約であり、内部的には列 stu_id が一意で null 以外の値であることを意味します。stu_id 列での重複は許可されておらず、null 以外の値は許可されていません。

  2. セマンティック制約が列に適用され、テーブルに存在する同様のデータ型の値が表示されます。通常、値の一貫性を保ち、特定のタイプを維持するために、列に適用されます。

    例:

    Stu_name varchar2(50);
    

    上記の例では、varchar2 は学生名を保持する 50 バイトの容量を持つデータ型です。

    列は文字タイプの値のみを保持し、double 値と integer 値は許可されません。したがって、これは一種のセマンティック制約です。

  3. 参照整合性は、データに制限を適用するために他のテーブルに適用される制約です。最もよく使用される制約は外部キー制約です。

    親テーブルに変更がある場合、子テーブルは親テーブルとの整合性を維持する必要があります。レコードを削除する場合は、子レコードの参照がぶら下がってはならず、参照整合性の制約になります。

    例:

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

    上記の例では、レポートカードに、親テーブルの学生の学生の学部またはコースが表示されています。参照整合性制約が適用されると、1つのテーブルでの操作が子テーブルでの作業に影響します。

参照整合性制約の下で、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));

上記のクエリは、int タイプの学生 ID として属性または列を持ち、列に対するエンティティ制約として主キーを持つテーブル student を作成します。その他の値属性には、データ型として varchardate を使用した name と birthday が含まれます。

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);

上記のクエリでは、iddepartment namestudentid などの属性を持つ department テーブルが作成されます。また、学生 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 に 3つのレコードを挿入します。

テーブル Department にレコードを挿入します。

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

上記のクエリは、テーブル部門にそれぞれの学生 ID の 3つの部門を挿入します。

次に、親テーブルのレコードを削除しましょう。

DELETE FROM Student WHERE stu_id = 102; 

最終結果では、親テーブルからの参照が削除されると、テーブル部門から 3 番目のレコードが削除され、3 番目のレコードがぶら下がります。

したがって、on delete cascade プロパティを使用して 3 番目のレコードを折りたたみます。このプロパティは、親テーブルが影響を受けるときに子テーブルのレコードを削除する参照整合性制約プロパティです。