一、数据库约束的概述
1.1 约束的作用
一般在创建表的时候给表的字段添加各种约束,从而保证输入到表中的数据是正确的。保证数据的正确性,完整性和有有效性。违反约束的数据是不能添加到表中去的。如果表已经存在,并且表已经有数据,添加约束的时候如果表中的数据已经违反了现在要添加的约束,约束会添加失败。
1.2 约束的种类
| 约束名 | 约束关键字 | 说明 |
|---|---|---|
| 主键 | primary key | 唯一,非空 |
| 唯一 | unique | 不能重复 |
| 默认 | default | 没有输入值,使用默认值 |
| 非空 | not null | 必须输入 |
| 外键 | foreign key … references | 外键在从表 主表:1方 从表:多方 |
二、主键约束
2.1 主键的作用
用来唯一标识表中的每一行记录,在创建表的时候,没张表都应该创建一个主键,只要有主键就有主键约束。
2.2 联合主键
主键可以不只一个字段,如果有多个字段组成的主键,成为联合主键。
2.3 主键的特点
(1)非空:必须要有值
(2)唯一:同一张表中不能出现与主键重复的字段名
2.4 主键的定义方式
字段名 字段类型 PRIMARY KEY
create table t1(
id int primary key, --指定id列为主键
city varchar(20)
);
insert into t1 value(1,'广州');
-- ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY' 违反主键约束
insert into t1 value(1,'深圳');
2.5 在已有的表中添加主键
ALTER TABLE 表名 ADD PRIMARY KEY(字段名);
alter table t1 add primary key(id);
2.6 删除主键
alter table 表名 drop primary key;
-- 删除t1表的主键约束
alter table t1 drop primary key;
2.7 主键自增
字段名 字段类型 PRIMARY KEY AUTO_INCREMENT
create table t2(
id int primary key auto_increment, -- 主键并且自增
city varchar(20)
);
--插入数据
insert into t2 values(null,'珠海');
注:自增长必须是整数类型,而且必须是主键可以使用。
三、唯一约束
概念:这一列的值不能重复
字段名 字段类型 UNIQUE
-- 创建表student, 包含字段(id, name),name这一列设置唯一约束,不能出现同名的学生
create table student (
id int primary key auto_increment, --主键约束,且自增
`name` varchar(20) unique
);
-- 添加一个同名的学生
insert into student (name) values('李四');
-- ERROR 1062 (23000): Duplicate entry '河北石家庄' for key 'city'
insert into student (name) values('李四');
select * from student;
四、非空约束
概念:这一列的值必须输入,不能为空
字段名 字段类型 NOT NULL
create table t4(
id int,
province varchar(30),
city varchar(20) not null -- 非空约束
);
insert into t4 values(1,'江苏','南京');
-- ERROR 1048 (23000): Column 'city' cannot be null city列不能为空
insert into t4 values(2,'江苏',null);
-- ERROR 1364 (HY000): Field 'city' doesn't have a default value city列没有默认值
insert into t4(id,province) values(2,'江苏');
五、默认值
概念:如果某一列没有输入值,使用默认值。如果输入了,则使用输入的值。
字段名 字段类型 default 默认值
create table t5(
id int,
province varchar(20),
city varchar(20) default '乌鲁木齐' -- 如果该列没填,默认为乌鲁木齐
);
-- 如果填了以真实的值为准
insert into t5 values(1,'西藏','拉萨');
-- 没有填默认为'乌鲁木齐'
insert into t5(id,province) values(2,'新疆');
-- 也可以使用MySQL提供的default关键字
insert into t5 values(3,'新疆',default);
-- 查询表数据
select * from t5;
六、外键约束
概念:外键出现在从表中,被主表的主键约束的那一列外键。
例如:部门与员工之间是1对多的关系,一个部门对应多个员工,一个员工属于一个部门。部门是1方(主表),员工是多方(从表)。
6.1 外键约束的定义方式
FOREIGN KEY(外键字段) REFERENCES 主表(主键)
-- 创建员工表(id,name,age,dep_id)
create table employee(
id int primary key auto_increment,
name varchar(20),
age int,
dept_id int, -- 外键的数据类型与主表中的主键相同
foreign key (dept_id) references dept(id) -- 本表的dept_id列依赖于dept表的id列
);
-- 违反外键约束
INSERT INTO employee (name, age,dept_id) VALUES ('小黄',23,3);
-- 添加3号部门
insert into dept values(3,'行政部','陕西西安');
-- 再次添加员工并指定为三号部门
INSERT INTO employee (name, age,dept_id) VALUES ('小黄',23,3);
6.2 向已有的表中添加外键
ALTER TABLE 表名 ADD CONSTRAINT 约束名 FOREIGN KEY (外键字段) REFERENCES 主表(主键)
alter table employee add constraint emp_dept_id_fk foreign key(dept_id) references dept(id);
-- 查看表的建表语句
show create table employee;
6.3 删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 约束名;
alter table employee drop foreign key emp_dept_id_fk;
6.4 外键的级联
- 什么是级联操作:在修改和删除主表的主键时,同时更新或删除副表的外键值,成为级联操作
| 级联操作语法 | 描述 |
|---|---|
| ON UPDATE CASCADE | 级联更新 |
| ON DELETE CASCADE | 级联删除 |
-- 删除外键约束-- 删除外键约束
alter table employee drop FOREIGN KEY emp_dept_id_fk;
-- 添加外键约束,级联更新和级联删除
alter table employee add constraint emp_dept_id_fk foreign key (dept_id) references dept(id) on update cascade on delete cascade;
select * from employee;
select * from dept;
-- 把部门表中id等于1的部门改成id等于10
update dept set id=10 where id=1;
-- 删除部门号是2的部门
delete from dept where id=2;