在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);
このとき、営業部門を削除しようとすると、削除に失敗してしまいます。