目次
概要
- 概念: 制約は、テーブル内のフィールドに作用して、テーブルに格納されるデータを制限するルールです。
- 目的: データベース内のデータの正確性、有効性、完全性を保証するため。
- 分類:
制約 | 説明する | キーワード |
---|---|---|
非NULL制約 | このフィールドのデータを NULL にすることはできません | NULLではありません |
一意の制約 | このフィールド内のすべてのデータが一意であり、重複していないことを確認してください | 個性的 |
主キー制約 | 主キーはデータ行の一意の識別子であり、空ではなく一意である必要があります。 | 主キー |
デフォルトの制約 | データを保存するときに、このフィールドの値が指定されていない場合は、デフォルト値が使用されます。 | デフォルト |
チェック制約 (バージョン 8.0.16 以降) | 特定の条件を満たすフィールド値を保存する | チェック |
外部キー制約 | 2 つのテーブルのデータ間の接続を確立し、データの一貫性と整合性を確保するために使用されます。 | 外部キー |
制約のデモンストレーション
テーブルの作成
必要に応じてフォームの作成を完了します。
フィールド名 | フィールドの意味 | フィールドタイプ | 制限 | 制約キーワード |
---|---|---|---|---|
ID | ID 一意の識別子 | 整数 | 主キー、および自動的に増加します | 主キー、AUTO_INCREMENT |
名前 | 名前 | varchar(10) | 空ではなく、ユニークです | NULL ではありません、一意です |
年 | 年 | 整数 | 0より大きく120以下 | チェック |
状態 | 州 | 文字(1) | この値が指定されていない場合、デフォルトは 1 になります。 | デフォルト |
性別 | 性別 | 文字(1) | なし |
自動拡張: テーブル内の行数に応じて ID が自動的に増加します。キーワードは auto_increment です。
create table user(
id int primary key auto_increment comment '主键',
name varchar(10) not null unique comment '姓名',
age int check(age > 0 and age <= 120) comment '年龄',
status char(1) default '1' comment '状态',
gender char(1) comment '性别'
) comment '用户表';
確認する
1. 主キーと自動拡張
データを挿入するときにIDを入力しません
create table user(
id int primary key auto_increment comment '主键',
name varchar(10) not null unique comment '姓名',
age int check(age > 0 and age <= 120) comment '年龄',
status char(1) default '1' comment '状态',
gender char(1) comment '性别'
) comment '用户表';
このとき、id が主キーとして使用されており、自動拡張制約があり、行数が増えると自動的に増加するため、入力する必要がないことがわかりました。
2. 名前は空ではなく一意です
名前の入力が空の場合、エラーが報告されます。また、名前が繰り返されると、挿入された値の主キーを適用した後、実際には挿入されないため、ID 値は 1 ずつジャンプします。(たとえば、 :1、2、3、5)
3. 年齢は 0 より大きく 120 歳以下でなければなりません
4. ステータスが指定されていない場合、デフォルトは 1 です。
insert into user (name,age,gender)
values ('Jack6',18,'男');
グラフィカルインターフェースの制約
外部キー制約
コンセプト
外部キーは、2 つのテーブル内のデータ間の接続を確立し、データの一貫性と整合性を確保するために使用されます。
注: 現在、上記の 2 つのテーブルはデータベース レベルで外部キー関係を確立していないため、データの一貫性と整合性は保証できません。
つまり、部門テーブルの研究開発部門を削除しても、従業員テーブルの研究開発部門の従業員は削除されず、データの整合性の問題が発生します。
文法
外部キーを追加する
CREATE TABLE 表名(
字段名 数据类型,
...
[CONSTRAINT] [外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表 (主列表名)
);
-- 或
ALTER TABLE 表名
ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCE 主表 (主列表名);
外部キーの削除
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
例
alter table emp
add constraint fk_emp_dept_id foreign key (dept_id) references dept(id);
alter table emp drop foreign key fk_emp_dept_id;
外部キーの削除/更新動作
行動 | 説明する |
---|---|
何もしない | 親テーブルの対応するレコードを削除/更新する場合は、まずそのレコードに対応する外部キーがあるかどうかを確認し、存在する場合は削除/更新を許可しません。(制限と同じ) |
制限 | 親テーブルの対応するレコードを削除/更新する場合は、まずそのレコードに対応する外部キーがあるかどうかを確認し、存在する場合は削除/更新を許可しません。(NO ACTIONと一致) |
カスケード | 親テーブルの該当レコードを削除・更新する場合は、そのレコードに対応する外部キーがあるかどうかを確認し、あれば子テーブルの外部キーを持つレコードを削除・更新します。 |
NULL を設定 | 親テーブルの対応するレコードを削除する場合は、まずそのレコードに対応する外部キーがあるかどうかを確認し、存在する場合は子テーブルの外部キーの値をnullに設定します(外部キーがnullを許可する必要があります)。 |
デフォルトを設定 | 親テーブルが変更されると、子テーブルは外部キー列をデフォルト値に設定します (Innodb はこれをサポートしません) |
ALTER TABLE 表名
ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCE 主表 (主列表名)
ON UPDATE CASCADE ON DELETE CASCADE;
デモ
alter table emp
add constraint fk_emp_dept_id foreign key (dept_id) references dept(id)
on update cascade on delete cascade ;
このとき、メインテーブルの研究開発部門のIDを6に変更します。
サブテーブルも更新されます。
要約する
- 非NULL制約: NOT NULL
- 一意の制約: UNIQUE
- 主キー制約: PRIMARY KEY (増分: AUTO_INCREMENT)
- デフォルトの制約: DEFAULT
- チェック制約: CHECK
- 外部キー: FOREIGN KEY
終わり
学習内容: ダークホース プログラマー - MySQL データベース コース