/*
- ClassName: TestMysql
- Description:
- Mysql的约束:
- 目的:
- 使得数据更准确,更完整
- 1、键约束
-
(1)主键约束
-
(2)唯一键约束
-
(3)外键约束
- 2、非空约束
- 3、默认值约束
- 4、自增约束
- 5、检查约束
- 三、主键约束:
- 1、关键字:primary key
- 2、特点:增加主键约束的列(字段)的值必须是非空的+唯一的
- 3、作用:保证表中不会出现两条无法区分的记录
- 4、要求:每一张表都必须有主键约束
- 5、分类
- 单列主键约束
- 复合主键约束
- (二)使用主键约束
- 1、创建主键约束
-
(1)在建表是指定主键约束
-
create table [数据库名.]表名称(
-
字段1 数据类型 primary key,
-
字段2 数据类型
-
);
-
create table dept(
-
id int primary key,
-
name varchar(20),
-
description varchar(100)
-
);
-
create table [数据库名.]表名称(
-
字段1 数据类型 ,
-
字段2 数据类型,
-
primary key(字段1)
-
);
-
或者
-
create table dept(
-
id int ,
-
name varchar(20),
-
description varchar(100),
-
primary key(id),
-
);
-
(2)建表后指定主键约束
-
create table dept(
-
id int ,
-
name varchar(20),
-
description varchar(100),
-
primary key(id),
-
);
-
修改表结构:
-
alter table dept add primary key(id);
- 2、删除主键约束
-
修改表结构
-
alter table 表名称 drop primary key;
-
alter table dept drop primary key;
- 3、复合主键
-
(1)建表时指定主键约束
-
create table [数据库.]表名称(
-
字段1 数据类型,
-
字段2 数据类型,
-
字段2 数据类型,
-
primary key(字段列表)
-
);
-
说明:复合主键不能在列后面加,需要单独指定
-
例如:
-
create table stu(
-
sid int primary key,#学号
-
sname varchar(20)#姓名
-
);
-
create table course(
-
cid int primary key,#课程编号
-
cname varchar(20) #课程名称
-
);
-
create table score(
-
id int #没有业务意义,只是唯一标记一行
-
sid int, #学号
-
cid int, #课程编号
-
score int #对应的成绩
-
);
-
insert into stu values (1,"张三"),(2, "李四");
-
insert into course values(1001,"java"),(1002,"mysql");
-
(2)建表后指定主键约束
-
alter table 表名称 add primary key(字段列表);
-
alter table score add primary key(sid, cid);
- 四、唯一键约束
- (一)概述
- 1、关键字:unique key
- 2、特点:指定了唯一键的列值必须唯一,不能重复
- 3、作用:给主键意外的列,限定唯一性
- 唯一键和主键的区别:
- (1)主键不能为空,唯一键可以为空
- (2)主键约束,一个表只能有一个,而唯一键可以有多个
- (二)使用唯一键
- 1、如何创建、指定唯一键
- (1)在建表时:
-
create table[数据库.]表名称(
-
字段1 数据类型 primary key,
-
字段2 数据类型 【unique key】,
-
);
-
create table emp(
-
eid int primary key,#员工编号
-
ename varchar(20), #姓名
-
cardid varchar(18) unique key, #身份证号
-
tel varchar(11) unique key
-
);
- (2) 在建表后:
- alter table[数据库名.]表名称 add unique key(字段名);
- alter table[数据库名.]表名称 add unique key(字段列表);#复合唯一
- 2、删除唯一键:
- 修改表结构:
- alter table【数据库名.】表名称 drop index 索引名;
- 如果不知道索引名,可以用如下语句查询:
- show index from 表名称;
- alter table emp drop index carid;
- 五、非空和默认值约束
- 1、如何指定非空约束
- (1)建表时:
-
create table emp(
-
eid int primary key, #员工编号
-
ename varchar(20) not null, #姓名
-
cardid varchar(18) unique key,#身份证号
-
tel varchar(11) unique key not null,
-
gender char not null default '男'
-
);
- (2)建表后:
- create table[数据库.]表名称(
-
-
字段1 数据类型 primary key,not null
-
-
-
字段2 数据类型 【unique key】,
-
-
-
-
);
-
- create table emp(
-
eid int primary key, #员工编号
-
ename varchar(20) not null, #姓名
-
cardid varchar(18) unique key,#身份证号
-
tel varchar(11) unique key not null,
-
gender char
- );
- alter table emp modify cardid varchar(18) unique key not null;
- alter table emp modify tel varchar(11) not null;
- alter table emp modify gender char not null default ‘男’;
*2、如何去掉非空和默认值约束
*
- alter table emp modify gen char
- 六、自增约束
- 1、关键字:auto_increment
- 2、特点:
- (1)一个表只能有一个自增列
- (2)自增列必须是整型的
- (3)自增列必须是键列,例如:主键,唯一键
- 3、如何指定自增
- create table emp(
-
eid int primary key auto_increment,
-
ename varchar(20) not null
- );
- 七、外键约束
- 外检约束不是必须的,而且数据量比较大是,不建议在数据库层面设计外键
- 因为这样数据库压力大
- (一)概述
- 1、关键字:foreign key
- 2、特点:
- (1)需要两张表,或者一张表虚拟成两张表
- (2)两张表分为主表和从表
-
外键的建立是在从表上建立的
- (3)被参考的表为主表,主表的被参考列必须是主键和唯一键
- (二)如何指定外键
- 1、在建表的时候指定外键
- 要求:
-
(1)建表的顺序
-
先建立主表,在建从表
-
create table[数据库.]表名称(
-
字段1 数据类型 primary key,not null,
-
字段2 数据类型 【unique key】【not null】 [default 默认值],
-
字段3 数据类型 【unique key】【not null】 [default 默认值],
-
......
-
foreign key (从表的外键列) references 主表名(主表被参考的列名)
-
);
- 部门表:
- create table dept(
-
did int primary key,
-
dname varchar(20) not null unique key,
-
description varchar(100) #部门简介
- );
- 职位表:
- create table job(
-
jid int primary key,
-
title varchar(20) not null,
-
description varchar(100)
- );
- 员工表:
- create table emp(
-
eid int primary key,
-
ename varchar(20) not null, #员工姓名
-
deptid int #所在的部门编号
-
foreign key(deptid) references dept(did);
-
foreign key(jobid) references job(jid);
- );
-
(2)删表顺序
-
先删除从表,在再删除主表
-
(3)添加数据、修改从表数据
-
先添加主表的记录,然后从表引用它,引用的主表的列值必须是存在的。
-
(4)删除、修改主表记录
-
A、默认情况下,如果主表的被参考列的值被引用了,那么就不能轻易的被删除和修改。
-
B、如果在建立外键,指定了“级联”的策略,那么可以做到级联修改和删除
-
foreign key(从表的外键列) references 主表名(主表被参考的列名)【on update cascade】 【on delete cascade】
-
C、如果建立在外键是,指定了“置空”的策略,那么可以做到级联修改和删除,从表的对应字段
-
foreign key(从表的外键列) references 主表名(主表被参考的列名)【on update set null】 [on delete set null】
- 2、建表后指定外键
- alter table 从表名称 add foreign key(从表的字段) references 主表名(主表被参考的列名)
- 3、同一张表,自引用
- create table emp(
-
eid int primary key, #员工编号
-
ename varchar(20) not null,#员工姓名
-
managerid int , #他的领导编号,因为他是领导也是员工
-
foreign key (managerid) references emp(id),
- );
- 4、如何删除外键
- alter table 从表名称 drop foreign key 外键约束名
- 如何查看外键约束名:
- select * from information_schema.table_constraints where table_name = “表名称”;
- date: 19-9-26 下午8:30
- @author: hadoop
- @since JDK 1.8
*/