データベース MySQL - 制約

目次

I. 概要

 2. 制約のデモ

3. 外部キー制約

1. コンセプト

2. 文法

3.削除/更新動作


I. 概要

  1. 概念: 制約は、テーブルに格納されているデータを制限するためにテーブルのフィールドに作用するルールです。
  2. 目的: データベース内のデータの正確性、有効性、および完全性を保証すること。
  3. 分類:
制約 説明 キーワード
非 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 ;

おすすめ

転載: blog.csdn.net/hdakj22/article/details/129696296