MySQL数据库语言基础-表的约束
概念:对表中的数据进行限定,保证数据的正确性、有效性和完整性
分类:
1.主键约束 primary key
2.非空约束 not null
3.唯一约束 unique
4.外键约束 foreign key
主键约束 primary key
1.非空且唯一
2.一张表只能有一个字段为主键
3.主键就是表中记录的唯一标识
创建表时添加主键约束
create table student
(
id int primary key,
name varchar(20) not null
);
-- 删除主键约束
alter table student drop primary key;
创建表之后添加主键约束
alter table student modify id int primary key;
主键的自动增长
如果某一列是数值类型的,使用auto_increment可以完成数值的自动增长
创建表时添加自动增长约束
create table student
(
id int primary key auto_increment,
name varchar(20) not null
);
-- 这种情况下 可以对用auto_increment修饰的列用null值,语法不会出错
insert into student values (1,'李四');
insert into student values (null,'王五'); -- null值是与上个行记录来进行自增
-- 删除自动增长
alter table student modify id int;
-- 添加自动增长
alter table student modify id int auto_increment;
非空约束 not null
创建表时添加约束
create table student
(
id int
name varchar(20) not null; -- 非空约束
);
insert into student values (1,'张三');
insert into student values (2,null); -- name添加了非空约束条件 所以此条语句会报错
-- 删除 name 的非空约束
alter table student modify name varchar(20);
-- 此时 name 的非空约束条件取消了 name可以为null
insert into student values (2,null); -- 这条语句不会报错
创建表完之后添加非空约束
alter table student modify name varchar(20) not null;
唯一约束 unique
创建表时添加唯一约束
drop table student;
create table student
(
id int
name varchar(20) unique; -- 唯一约束
);
-- 删除唯一约束
alter table student drop index name;
创建表之后添加唯一约束
alter table student modify name varchar(20) unique;
外键约束 foreign key
1.涉及多张表之间的相互关系
-- 创建一个表格 用于部门分配活动
create table emp
(
id int primary key auto_increment,
name varchar(20),
age int,
dep_name varchar(20), -- 部门名称
dep_location varchar(20) -- 部门位置
);
insert into emp (name,age,dep_name,dep_location) values ('张三',20,'研发部','深圳');
insert into emp (name,age,dep_name,dep_location) values ('李四',21,'创意部','北京');
insert into emp (name,age,dep_name,dep_location) values ('王五',22,'研发部','深圳');
insert into emp (name,age,dep_name,dep_location) values ('赵六',23,'研发部','深圳');
insert into emp (name,age,dep_name,dep_location) values ('田七',25,'创意部','北京');
insert into emp (name,age,dep_name.dep_location) values ('洪八',21,'创意部','北京');
通过观察发现上面添加的数据存在冗余成分,对于操作数据库有很多的不方便,
针对如此情况,我们可以对其表采用拆分的形式,这样就会去除很多冗余成分,
大大提高效率
-- 部门表
create table department
(
id int primary key auto_increment,
dep_name varchar(20),
dep_location varchar(20)
);
-- 员工表
create table employee
(
id int primary key auto_increment,
name varchar(20),
age int,
dep_id int -- 外键对应主表主键的主键
);
insert into department values (null,'研发部','深圳');
insert into department values (null,'创意部','北京');
insert into employee values ('张三',20,1);
insert into employee values ('李四',21,2);
insert into employee values ('王五',22,1);
insert into employee values ('赵六',23,1);
insert into employee values ('田七',25,2);
insert into employee values ('洪八',21,2);
上面将一个表拆分成了两个独立的表,从整体上看,效率的到了很大的提高,但是,只有拆分,还不算完善,拆分的两个表格没有关联性,这不符合我们拆表的初衷。因此,这时就需要用到外键约束条件,使得两个表格能够相互关联。
在创建表的时候添加外键约束条件
外键约束的语法
constraint 外键名称 foreign key 外键字段 references 对应表(主键列名)
-- 部门表
create table department
(
id int primary key auto_increment,
dep_name varchar(20),
dep_location varchar(20)
);
-- 员工表
create table employee
(
id int primary key auto_increment,
name varchar(20),
age int,
dep_id int, -- 外键对应主表的主键
constraint emp_dep_id foreign key dep_id references department(id)
);
-- 删除外键
alter table employee drop foreign key emp_dep_id;
-- 添加外键
alter table employee add constraint emp_dep_id foreign key dep_id references department(id);
带有外键关联的表格,安全性更高。
级联操作
通俗的讲就是一个表关联外键的表主键更新数据,主表中外键字段数据也要自动更新
语法
constraint 外键名称 foreign key 外键字段 references 关联表(主键)on update cascade
-- 添加级联更新操作
alter table employee add constraint emp_dep_id foreign key emp_id references department(id) on update cascade;
-- 级联删除操作 慎用
alter table employee add constraint emp_dep_id foreign key emp_id references department(id) on update cascade on delete cascade;