目次
I. 概要
- 概念: 制約は、テーブルに格納されているデータを制限するためにテーブルのフィールドに作用するルールです。
- 目的: データベース内のデータの正確性、有効性、および完全性を保証すること。
- 分類:
制約 | 説明 | キーワード |
非 null 制約 | このフィールドのデータが null にならないように制限する | ヌルではない |
一意の制約 | このフィールドのすべてのデータが一意であり、繰り返されていないことを確認してください | 個性的 |
主キー制約 | 主キーはデータ行の一意の識別子であり、null 以外で一意である必要があります | 主キー |
デフォルトの制約 | データを保存するとき、このフィールドの値が指定されていない場合、デフォルト値が使用されます | デフォルト |
チェック制約 (バージョン 8.0.16 以降) |
フィールド値が特定の条件を満たすことを確認する | チェック |
外部キー制約 | データの一貫性と整合性を確保するために、2 つのテーブルのデータ間の接続を確立するために使用されます。 | 外部キー |
注:制約はテーブルのフィールドに適用され、テーブルの作成/変更時に制約を追加できます。
2. 制約のデモ
要件に従って、テーブル構造の作成を完了します。
フィールド名 フィールドの意味 フィールドタイプ 制限 制約キーワード ID 一意のID 整数 主キー、自動インクリメント 主キー,AUTO_INCREMENT 名前 名前 varchar(10) 空ではなく、一意です NOT NULL、一意 年 年 整数 0 より大きく 120 以下 チェック スターテス 州 char(7) この値が指定されていない場合、デフォルトで 1 になります。 デフォルト 性別 性別 char(7) なし
create table user(
id int primary key auto_increment comment '主键',
name varchar(10) not null unique comment '姓名',
age int check ( age>= 0 && age <= 120 ) comment '年龄',
status char(1) default '1' comment '状态',
gender char(1) comment '年龄'
)comment '用户表';
-- 添加数据
insert into user(id, name, age, status, gender)
values (1,'Tom',19,'1','男'),(2,'Rose',25,'0','女');
エラー判定:
- ユニーク制約 (ID はユニーク):
- 非 null 制約 (名前を空にすることはできません):
- チェック制約 (年齢層):
3. 外部キー制約
1. コンセプト
- 外部キーは、データの一貫性と整合性を確保するために、2 つのテーブルのデータ間の接続を確立するために使用されます。
注:現在、上記の 2 つのテーブルはデータベース レベルで外部キーの関連付けを確立していないため、データの一貫性と整合性は保証できません。
2. 文法
- 外部キーを追加します。
ALTER TABLEテーブル名ADD CONSTRANT外部キー名FOREIGN KEY (外部キーフィールド名) REFERENCES メインテーブル (メインテーブル列名);
-- 建表
create table emp(
id int primary key auto_increment comment 'ID',
name varchar(50) not null unique comment '姓名',
age int comment '年龄',
salary int comment '薪资',
entrydate date comment '入职时间',
managerid int comment '直属领导id',
dept_id int comment '部门id'
)comment '员工表';
create table dept(
id int auto_increment comment 'ID' primary key ,
name varchar(50) not null comment '部门名称'
)comment '部门表';
-- 添加数据
insert into dept(id, name)
values (1,'研发部'),(2,'市场部'),(3,'财务部'),(4,'销售部'),(5,'总经办');
insert into emp(id, name, age, salary, entrydate, managerid, dept_id)
values (1,'金庸',66,'总裁',20000,'2000-01-01',null,5),
(2,'张无忌',20,'项目经理',12500,'2005-12-05',1,1),
(3,'杨逍',33,'开发',8400,'2000-11-03',2,1),
(4,'韦一笑',48,'开发',11000,'2002-02-05',2,1),
(5,'常同春',43,'开发',10500,'2004-09-07',3,1);
-- 添加外键
alter table emp add constraint fk_emp_dept_id
foreign key (dept_id) reference dept(id);
- 外部キーの削除: ALTER TABLEテーブル名DROP FOREIGN KEY外部キー名;
-- 删除外键
alter table emp drop foreign key fk_emp_dept_id;
3.削除/更新動作
行動 | 例証する |
何もしない | 親テーブルの対応するレコードを削除/更新する場合、まずレコードに対応する外部キーがあるかどうかを確認し、存在する場合は削除/更新を許可しません。(制限と一致) |
制限 | 親テーブルの対応するレコードを削除/更新する場合、まずレコードに対応する外部キーがあるかどうかを確認し、存在する場合は削除/更新を許可しません。(NOACTION と一致) |
カスケード | 親テーブルの対応するレコードを削除・更新する場合、対応する外部キーがあるかどうかを確認し、ある場合は子テーブルのレコードを外部キーで削除・更新します。 |
ヌルを設定 | 親テーブルの対応するレコードを削除する場合、まずレコードに対応する外部キーがあるかどうかを確認し、存在する場合は、子テーブルの外部キーの値を null に設定します (これには、外部キーが null を取ることが許可されている必要があります)。 |
デフォルト設定 | 親テーブルが変更されると、子テーブルは外部キー列をデフォルト値に設定します (Innodb はサポートしていません)。 |
構文: ALTER TABLEテーブル名ADD CONSTRAINT外部キー名FOREIGN KEY (外部キー フィールド) REERENCES主テーブル名 (主テーブル フィールド名) ON UPDATE CASOADE ON DELETE CASCAOE ;
-- 外键的删除和更新行为
-- cascade
alter table emp add constraint fk_emp_dept_id
foreign key (dept_id) references dept(id)
on update cascade on delete cascade ;
-- set null
alter table emp add constraint fk_emp_dept_id
foreign key (dept_id) references dept(id)
on update set null on delete set null ;