MySQL-约束
约束-简介
概念
约束实际上就是表中数据的限制条件。
作用
表在设计的时候加入约束的目的就是为了保证表中的记录完整性和有效性,比如用户表有些列的值 (手机号) 不能为空,有些列的值 (身份证) 不能重复。
分类
- 主键约束(primary key) PK
- 自增长约束(auto_increment)
- 非空约束(not null)
- 唯一性约束(unique)
- 默认约束(default)
- 零填充约束(zerofill)
- 外键约束(foreign key) FK
约束-主键约束
简介
概念
- MySQL主键约束是一个列或者多个列的组合,其值唯一地标识表中的每一行,方便在RDBMS中尽快的找到某一行。
- 主键约束相当于 唯一约束+非空约束 的组合,主键约束列不允许重复,也不允许出现空值。
- 每个表最多只允许一个主键
- 主键约束的关键字是:primary key
- 当创建主键约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。
操作
- 添加单列主键
- 添加多列联合主键
- 删除主键
操作-单列主键
创建单列主键有两种方式,一种是在定义字段的同时指定主键,一种是定义完字段之后指定主键。
方式一
use student;# 使用哪个数据库
create table emp1(
eid int primary key,
name varchar(20),
deptId int,
salary double
);
方式二
create table emp2(
eid int,
name varchar(20),
depId int,
salary double,
constraint pk1 primary key(eid) # constraint pk1 可以省略
);
主键的作用
-- 主键约束的列非空并且唯一
insert into emp2() values(1001,'李四',10,6000);# 插入一条数据
- 当再插入相同的 ‘eid’ 时就会报错 "重复输入 ‘1001’ "
- 主键也不能为空,不然也会报错
操作-联合主键
所谓联合主键,就是这个主键是由一张表中多个字段组成的。
注意
1.当主键是由多个字段组成时,不能直接在字段名后面声明主键约束。
2.一张表只能有一个主键,联合主键也是一个主键。
用法
create table emp3(
name varchar(20),
deptId int,
salary double,
constraint pk2 primary key(name,deptId)
);
insert into emp3 values('张三',10,2000);# 数据1
insert into emp3 values('张三',20,2000);# 数据2
insert into emp3 values('李四',10,2000);# 数据3
- 上面的 “name” 和 “depId” 是联合主键,意思就是说后面再插入的数据中 “name” 和 “depId” 不能和数据1完全一样,但是可以"name" 相同,但是 “depId”不同,或者 “depId” 相同,“name”不同,并且联合主键的各列,每一列都不能为空
错误示范
操作-通过修改表结构添加主键
主键约束不仅可以在创建表的同时创建,也可以在修改表时添加(比如当创建了表后忘了加主键就可以使用这种方法)
-- 提前创建好表emp4
create table emp4(
name varchar(20),
age int,
fox varchar(6),
results double
);
-- 添加联合主键约束(也可以添加单个)
alter table emp4 add primary key(name,age);
操作-删除主键
一个表中不需要主键约束时,就需要从表中将其删除。删除主键约束的方法要比创建主键约束容易得多。
注意
不需要指定哪个主键因为一个表就一个主键
alter table emp4 drop primary key; # 删除emp4的主键
约束-自增长约束
概念
在MySQL中,当主键定义为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值。每增加一条记录,主键会自动以相同的步长进行增长。
通过给字段添加 auto_increment 属性来实现主键自增长
操作
-- 创建表
create table t_user(
id int primary key auto_increment,
name varchar(20)
);
-- 插入数据
insert into t_user values(null,'张三'); # 第一个参数写null就行了,但是不能空着
insert into t_user(name) values('李四'); # 也可以指定字段赋值
insert into t_user values(3,'王五'); # 也可以自己写id,但是不能重复
insert into t_user values(7,'赵六'); # 也可以不需要按顺序写
insert into t_user values(null,'小狗'); # 它会根据上一条数据的id自增长(每次加1)
特点
- 默认情况下,auto_increment 的初始值是 1 ,每新增一条记录,字段值自动加 1 。
- 一个表中只能有一个字段使用 suto_increment 约束,且该字段必须有唯一索引,以避免序号重复(即为主键或主键的一部分)。
- auto_increment 约束的字段必须具备 NOT NULL 属性。
- auto_increment 约束的字段只能是整数类型 (tinyint,smallint,int,bigint 等)
指定自增字段初始值
如果第一条记录设置了该字段的初始值,那么新增加的记录就从这个初始值开始自增。例如,如果表中插入的第一条记录的 id 值设置为 5 ,那么再插入记录时,id 的值就会从 5 开始往上增加。
方式一
create table t_user2(
id int primary key auto_increment,
name varchar(20)
)auto_increment = 100;
insert into t_user2 values(null,'张三');
insert into t_user2 values(null,'张三');
方式二
create table t_use3 (
id int primary key auto_increment,
name varchar(20)
);
alter table t_use3 auto_increment = 200;
insert into t_use3 values(null,'张三');
insert into t_use3 values(null,'李四');
delete 和 truncate 在删除后自增列的变化
- delete 数据之后自动增长从断点开始
- truncate 数据之后自动增长从默认起始值开始
delete from t_use3;
insert into t_use3 values(null,'张三');
insert into t_use3 values(null,'李四');
truncate t_use3;
insert into t_use3 values(null,'张三');
insert into t_use3 values(null,'李四');
约束-非空约束
概念
MySQL 非空约束(not null) 指字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统就会报错。
方式一
create table t_use5(
id int,
name varchar(20) not null, -- 指定非空约束
address varchar(20) not null -- 指定非空约束
);
insert into t_use5(id) values(111); -- 不可以
insert into t_use5(id,name,address) values(111,null,null); -- 不可以
insert into t_use5(id,name,address) values(111,'null','null'); -- 可以(字符串:NULL)
insert into t_use5(id,name,address) values(111,'',''); -- 可以(空串)
方式二
create table t_user1(
id int,
name varchar(20) ,
address varchar(20)
);
alter table t_user1 modify name varchar(20) not null;
alter table t_user1 modify address varchar(20) not null;
查看是否为非空约束
输入命令,运行结果看【状态】那栏,“NO” 代表是非空约束
desc t_user1; -- desc 后面的是你要查询的表名
或者直接右键表点击【设计表】,进去看【不是null】那栏,打钩√ 就是代表非空约束
删除非空约束
删除也是非常简单只需把 'not null 去掉运行即可
alter table t_user1 modify name varchar(20);
alter table t_user1 modify address varchar(20);
约束-唯一约束
概念
唯一约束 (Unique key) 是指所有记录中字段的值不能重复出现。例如,为 id 字段加上唯一性约束后,每条记录的 id 值都是唯一的,不能出现重复的情况。
方式一
create table t_user2(
id int,
name varchar(20) unique -- 指定唯一约束
);
insert into t_user2 values(100,'李四');
insert into t_user2 values(100,'李四2');
insert into t_user2 values(101,null); -- 在MySQL中 null 和任何值都不相同,甚至和自己也不相同
insert into t_user2 values(102,null);
方式二
create table t_user3(
id int,
name varchar(20)
);
alter table t_user3 add constraint unique_pn unique(name);
删除唯一约束
alter table t_user3 drop index unique_pn; -- 这是方式二的删除约束方式,unique_pn代表是这个唯一约束的名字
alter table t_user2 drop index name; -- 这是方式一的删除约束方式
约束-默认约束
概念
MySQL 默认值约束用来指定某列的默认值。
方式一
create table t_user4(
id int,
name varchar(20) default '小狗' -- 指定默认约束
);
insert into t_user4 values(123,'小米');
insert into t_user4(id) values(123);
insert into t_user4 values(123,null); -- 这个不会触发默认值,因为已经明确指定为null
方式二
create table t_user6(
id int,
name varchar(20)
);
alter table t_user6 modify name varchar(20) default '张三';
insert into t_user6 values(123,'小米');
insert into t_user6(id) values(123);
insert into t_user6 values(123,null);
删除默认约束
alter table t_user6 modify name varchar(20) null;
insert into t_user6(id) values(7); -- 删除后再插入可以看到约束已经没了
约束-零填充约束
概念
- 插入数据时,当该字段的值的长度小于定义的长度时,会在该值的前面补上相应的0
- zerofill 默认为 int(10)
- 当使用 zerofill 时,默认会自动加 unsigned(无符号)属性,使用 unsigned 属性后,数值范围是原来的2倍,例如,有符号为 -128~+127,无符号为 0~256
操作
create table t_user7(
id int zerofill,
name varchar(20)
);
insert into t_user7 values(111,'张三');
insert into t_user7 values(1,'李四');
删除零填充约束
alter table t_user7 modify id int;