约束
什么是约束?
- 约束是作用于表中列上的规则,用于限制加入表的数据;
- 约束的存在保证了数据库中数据的正确性、有效性以及完整性。
约束的分类
- 非空约束:
NOT NULL
,保证列中所有数据不能有 null 值 - 唯一约束:
UNIQUE
,保证列中所有数据各不相同 - 主键约束:
PRIMARY KEY
,主键是一行数据的唯一标识,要求非空且唯一 - 默认约束:
DEFAULT
,保存数据时,未指定值则采用默认值 - 检查约束:
CHECK
,保证列中的值满足某一条件(MySQL中没有检查约束) - 外键约束:
FOREIGN KEY
,外键用于让两个表的数据之前建立链接,保证数据的一致性和完整性。
举例子
CREATE TABLE emp (
-- 员工 id ,设置为主键约束,并且自增长
id INT PRIMARY KEY auto_increment,
-- 员工姓名 非空且唯一
ename VARCHAR(20) NOT NULL UNIQUE,
-- 入职日期 非空
joindate DATE NOT NULL,
-- 工资 非空
salary DOUBLE(7, 2) NOT NULL,
-- 奖金 默认为 0
bonus DOUBLE(7, 2) DEFAULT 0
);
非空约束
概念
NOT NULL
:非空约束用于保证列中的所有数据不能有null
值
语法
添加非空约束:
-- 创建表时添加非空约束:
CREATE TABLE 表名{
列名 数据类型 NOT NULL,
...
};
-- 键完表后添加非空约束:
ALTER TABLE 表名 MODIFY 字段名 数据类型 NOT NULL;
删除非空约束:
ALTER TABLE 表名 MODIFY 字段名 数据类型
唯一约束
概念
UNIQUE
:唯一约束,保证列中所有数据各不相同(AUTO_INCREMENT
:当不指定值时自动增长)
语法
添加唯一约束:
-- 创建表时添加唯一约束
-- 方式一:
CREATE TABLE 表名{
列名 数据类型 UNIQUE [AUTO_INCREMENT],
...
};
-- 方式二:
CREATE TABLE 表名{
列名 数据类型,
...
[CONSTRAINT][约束名称] UNIQUE(列名)
};
-- 键完表后添加唯一约束:
ALTER TABLE 表名 MODIFY 字段名 数据类型 UNIQUE;
删除唯一约束:
ALTER TABLE 表名 DROP INDEX 字段名;
主键约束
概念
PRIMARY KEY
:主键是一行数据的唯一标识,要求非空且唯一- 一张表只能有一个主键
- 当某一列是数字类型并且唯一(当作主键约束),此时可以添加自动增长的属性,即
auto_increment
。
语法
添加主键约束:
-- 创建表时添加主键约束
-- 方式一:
CREATE TABLE 表名{
列名 数据类型 PRIMARY KEY [AUTO_INCREMENT];
...
};
-- 方式二:
CREATE TABLE 表名{
列名 数据类型,
...
[CONSTRAINT][约束名称] PRIMARY KEY(列名)
};
-- 建完表后添加主键约束:
ALTER TABLE 表名 ADD PRIMARY KEY(字段名);
删除主键约束:
ALTER TABLE 表名 DROP PRIMARY KEY;
默认约束
概念
DEFAULT
:保存数据时未指定值则采用默认值
语法
添加默认约束:
-- 创建表时添加默认约束:
CREATE TABLE 表名{
列名 数据类型 默认值,
...
};
-- 建完表后添加默认约束:
ALTER TABLE 表名 ALTER 列名 SET DEFAULT 默认值;
删除默认约束:
ALTER TABLE 表名 ALTER 列名 DROP DEFAULT;
外键约束
概念
FOREIGN KEY
:外键是用来让两个表的数据之间建立链接,以保证数据的一致性和完整性。
语法
添加外键约束:
-- 创建表时添加外键约束:
CREATE TABLE 表名 {
列名 数据类型,
...
[CONSTRAINT] [外键名称] FOREIGN KEY(外键列名) REFERENCES 主表(主表列名)
};
-- 键完表后添加外键约束:
ALTER TABLE 表名
ADD CONSTRAINT 外键名
FOREIGN KEY(外键列名)
REFERENCES 主表(主表列名);
删除外键约束:
ALTER TABLE 表名 DROP FOREIGN KEY 外键名;
举例子
-- 部门表:
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 个部门:
INSERT INTO
dept(dep_name, addr)
VALUES
('研发部', '广州'),
('销售部', '上海');
-- 添加员工, dep_id 表示员工所在的部门:
INSERT INTO
emp (NAME, age, dep_id)
VALUES
('张三', 22, 1),
('李四', 20, 1),
('王五', 18, 2),
('赵六', 20, 2),
('孙七', 22, 3),
('周八', 18, 3);