数据库约束

一、数据库约束的概述

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;

版权声明:本文为weixin_45097432原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。