约束
概念&分类
-
约束的概念:
- 约束是作用表中列的规则,来限制输入到表中的数据。
- 约束保证了数据库中数据的正确性、有效性和完整性。
-
约束的分类
约束名称 描述 关键字 非空约束 保障列中所有数据不能有NULL值 NOT NULL 唯一约束 保障列中无重复 UNIQUE 主键约束 主键是一行数据的唯一标识,要求非空且唯一 PRIMARY KEY 默认约束 保证列中的值满足某一条件 DEFAULT 检查约束 保存数据时,未指定值采用默认值 CHECK 外键约束 让两个表的数据之间建立链接,保证数据的一致性和完整性 FOREIGN KEY - MySQL中不支持检查约束。
非空约束
- 创建一个员工表
drop table if exists emp;
#非空not null,唯一unique,主键primary key,检查check,默认default,外键foreign key.
create table emp(
id int primary key auto_increment, #员工id且主键且自增长
ename varchar(50) not null unique, #员工姓名,非空且唯一
joindate date not null, #日志日期,非空
salary double(7,2) not null, #工资,非空
bonus double(7,2) default 0 #奖金,默认值为0
);
-- 演示非空约束
insert into emp(id,ename,joindate,salary,bonus) values(4,null,'2011-01-01',5200,500);
insert into emp(id,ename,joindate,salary,bonus) values(5,'李六','2011-01-01',5200,500);
唯一约束
-- 演示唯一约束
insert into emp(id,ename,joindate,salary,bonus) values(6,'张三','2011-01-01',5200,500);
insert into emp(id,ename,joindate,salary,bonus) values(6,'黄七','2011-01-01',5200,500);
主键约束
-- 演示主键约束,主键非空且唯一
insert into emp(id,ename,joindate,salary,bonus) values(null,'张三','2011-01-01',5200,500);
insert into emp(id,ename,joindate,salary,bonus) values(2,'张三','2011-01-01',5200,500);
insert into emp(id,ename,joindate,salary,bonus) values(3,'王五','2011-01-01',5200,500);
- 演示自动增长
-- 演示自动增长:auto_increment 当列时数字类型并且唯一约束
insert into emp(ename,joindate,salary) values('原九','2011-01-01',5200);
insert into emp(ename,joindate,salary) values('原九2','2011-01-01',5200);
insert into emp(id,ename,joindate,salary) values(null,'原九3','2011-01-01',5200);
默认约束
-- 演示默认约束
insert into emp(id,ename,joindate,salary,bonus) values(7,'张八','2011-01-01',5200,null);
#实现默认约束时,不给变量名和值才算是默认约束,给null也算值不会显示默认值
insert into emp(id,ename,joindate,salary) values(8,'原九','2011-01-01',5200);
检查约束
- MySQL中不支持使用,故此处不演示。
外键约束
- 目的:让两个表之间建立物理联系而非逻辑联系。
-
在创建表时就建立好外键约束:
格式:constraint 外键名称(fk _ 外键所在的表名 _ 主键所在的表名) foreign key(外键列名) references 主表名称(列名);
create table dept( id int primary key auto_increment, dep_name varchar(20) not null unique, addr varchar(20) not null ); create table emp( id int primary key auto_increment, name varchar(20) not null unique, age int not null, dep_id int not null , -- 添加外键dep_id 关联 dept表中的id主键 constraint fk_emp_dept foreign key(dep_id) references dept(id); ); -- 添加部门的数据 INSERT INTO dept(dep_name, addr) VALUES ('研发部','广州'),('销售部','深圳'); -- 添加员工的数据 INSERT INTO emp(name, age, dep_id) VALUES ('张三',21,1), ('李四',20,1), ('王五',22,1), ('赵六',21,2), ('孙七',22,2), ('周八',21,2); SELECT * FROM dept; SELECT * FROM emp;
- 删除外键
ALTER TABLE emp DROP FOREIGN KEY fk_emp_dept;
- 建完表后再添加外键
格式:alter table 外键所在表名 constraint 外键名称 foreign key(外键名称) references 主键表(主键);
ALTER TABLE emp CONSTRAINT fk_emp_dept FOREIGN KEY(dep_id) REFERENCES dept(id);