この記事では、MySQL の制約について理解します。

ここに画像の説明を挿入

在SQL标准中,一共规定了6种不同的约束,非 null 制約、一意制約、チェック制約などが含まれますが、チェック制約は MySQL ではサポートされていないため、この記事では最初に残りの 5 つの制約について詳細な説明と実践を行います。


1. 制約の概念

约束是作用于表中列上的规则,用于限制加入表的数据。たとえば、主キーとして使用される列は空ではなく一意である必要があります。そうしないと、データを区別できなくなります。制約の存在により、データベース内のデータの正確性、有効性、整合性が保証されます。したがって、制約はデータベース設計において非常に重要です。

2. 制約の分類

前述したように、SQL 標準では制約を 6 つのカテゴリ (非 null 制約、一意制約、主キー制約、チェック制約、デフォルト制約、外部キー制約) に分類しています。制約を追加する場合は、SQL にキーワードを追加して制限するだけです。テーブル内のデータ。

制約タイプ 関数
NOT NULL 制約 列内のすべてのデータが null 値を含むことができないようにする
一意の制約 UNIQUE 列内のすべてのデータが異なることを保証します
主キー制約 PRIMARY KEY 主キーはデータ行の一意の識別子であり、null ではなく一意である必要があります。
チェック制約 CHECK 列の値が特定の条件を満たすことを保証します
デフォルト制約 DEFAULT データを保存するとき、値が指定されていない場合は、デフォルト値が使用されます。
外部キー制約 FOREIGN KEY 外部キーを使用して 2 つのテーブル内のデータ間のリンクを確立し、データの一貫性と整合性を確保します。

3. 非null制約

目的: 列内のすべてのデータが NULL 値を持つことができないようにするため

制約を追加します。

CREATE TABLE 表名(
	列名 数据类型 NOT NULL,
);

テーブルの構築後に非 null 制約を追加します。

ALTER TABLE 表名 MODIFY 字段名 数据类型 NOT NULL;

制約を削除します。

ALTER TABLE 表名 MODIFY 字段名 数据类型;

4. 固有の制約

目的: 列内のすべてのデータが異なることを確認するため

制約を追加します。

CREATE TABLE 表名(
	列名 数据类型 UNIQUE [AUTO_INCREMENT],
	-- AUTO_INCREMENT: 当不指定值时自动增长
);

CREATE TABLE 表名(
	列名 数据类型,
	[CONSTRAINT] [约束名称] UNIQUE(列名)
);

テーブルを構築した後、一意の制約を追加します。

ALTER TABLE 表名 MODIFY 字段名 数据类型 UNIQUE;

制約を削除します。

ALTER TABLE 表名 DROP INDEX 字段名;

5. 主キー制約

目的: 主キーはデータ行の一意の識別子であり、null ではなく一意である必要があります。

制約を追加します。

CREATE TABLE 表名(
	列名 数据类型 PRIMARY KEY [AUTO_INCREMENT],
);

CREATE TABLE 表名(
	列名 数据类型,
	[CONSTRAINT] [约束名称] PRIMARY KEY(列名)
);

テーブルが構築されたら、主キー制約を追加します。

ALTER TABLE 表名 ADD PRIMARY KEY(字段名);

制約を削除します。

ALTER TABLE 表名 DROP PRIMARY KEY;

6. デフォルトの制約

目的: データを保存するとき、値が指定されていない場合は、デフォルト値が使用されます。

制約を追加します。

CREATE TABLE 表名(
	列名 数据类型 DEFAULT 默认值,
);

テーブルの作成後にデフォルトの制約を追加します。

ALTER TABLE 表名 ALTER 列名 SET DEFAULT 默认值;

制約を削除します。

ALTER TABLE 表名 ALTER 列名 DROP DEFAULT;

7. 外部キー制約

当我们添加了外键以后,就在数据库层面建立了两张表的关系。

目的: 外部キーは、2 つのテーブルのデータ間のリンクを確立し、データの一貫性と整合性を確保するために使用されます。

制約を追加します。

CREATE TABLE 表名(
	列名 数据类型,
	[CONSTRAINT] [外键名称] FOREIGN KEY(外键列名) REFERENCES 主表(主表列名)
);

テーブルの構築後に外部キー制約を追加します。

ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);

制約を削除します。

ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

7. 制約のケーススタディ

まず、次の例を使用して制約を練習します。

-- 删除stu表
drop table if exists stu;
-- 创建stu表
CREATE TABLE stu (
id int primary key, -- 编号 主键
name varchar(10)  not null unique, -- 姓名 非空,唯一
age int not null, -- 年龄 非空
gender varchar(5) not null, -- 性别 非空
math double(5,2) not null, -- 数学成绩  非空
english double(5,2) default 0 -- 英语成绩 默认为0
);

ここに画像の説明を挿入

主キー制約(空ではなく一意であることを特徴とする) を確認し、まずデータを追加します。

insert into stu(id,name,age,gender,math,english) values(1,'小张',23,'男',66,78);

2 番目のデータを追加するときは、ID を null 値として追加してみてください。

insert into stu(id,name,age,gender,math,english) values (null,'小李',20,'女',98,87);

ここに画像の説明を挿入

ID を重複値として追加してみてください。

insert into stu(id,name,age,gender,math,english) values (1,'小陈',55,'男',56,77);

ここに画像の説明を挿入主キー制約を確認しましたが、不正なデータを追加すると追加は失敗します。

非 null 制約を検証します。

次のデータを追加すると:

insert into stu(id,name,age,gender,math,english) values (2,NULL,20,'女',76,65);

ここに画像の説明を挿入
一意の制約を検証します。

次のデータを追加すると:

insert into stu(id,name,age,gender,math,english) values 
(5,'小张',20,'男',86,NULL);

ここに画像の説明を挿入デフォルトの制約を検証します。

次のデータを追加すると:

insert into stu(id,name,age,gender,math) values (6,'小赵',23,'男',99);

ここに画像の説明を挿入

外部キー制約を検証します。

次のケースを使用して外部キー制約を検証します。

-- 删除表
DROP TABLE IF EXISTS emp;
DROP TABLE IF EXISTS dept;
-- 部门表
CREATE TABLE dept(
id int primary key auto_increment,
dep_name varchar(20),
addr varchar(20)
);
-- 员工表
CREATE TABLE emp(
id int primary key auto_increment,
name varchar(20),
age int,
dep_id int,
-- 添加外键 dep_id,关联 dept 表的id主键
CONSTRAINT fk_emp_dept FOREIGN KEY(dep_id) REFERENCES dept(id)
);

この時点で、従業員テーブルに外部キーを追加しました。これは、データベース レベルで 2 つのテーブル間のリレーションシップを確立することと同じです。このとき、従業員テーブルに部門 1 に所属する従業員 a がいるとします。次に、部門テーブルを削除したいのですが、社員 a は部門 1 に属しているため、部門 1 の削除は失敗します。このとき、2 つのテーブルの間にリレーションシップが確立されます。

ここに画像の説明を挿入データの追加:

-- 添加 2 个部门
insert into dept(dep_name,addr) values
('研发部','西安'),('销售部', '成都');
-- 添加员工,dep_id 表示员工所在的部门
INSERT INTO emp (NAME, age, dep_id) VALUES
('张三', 20, 1),
('李四', 20, 2);

このとき、営業部門を削除しようとすると、削除に失敗してしまいます。

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/zhangxia_/article/details/131024720