1 MySQL约束简介
概念: 约束(constraint)实际上就是表中数据的限制条件。
作用: 表在设计的时候加入约束的目的就是为了保证表中的记录完整性和有效性,比如用户表有些列的值(手机号)不能为空,有些列的值(身份证号)不能重复,性别不能为男女外的其他值等等。
分类:
- 主键约束
- 自增长约束
- 非空约束
- 唯一性约束
- 默认约束
- 零填充约束
- 外键约束
2 主键约束
概念:
- MySQL主键约束是一个列或者多个列的组合,其值能唯一地标识表中每一行,方便在ROBMS中尽快找到某一行。
- 主键约束相当于唯一约束 + 非空约束的组合,主键约束不允许重复也不允许出现空值。(非空且唯一)
- 每个表最多只允许一个主键。
- 主键约束的关键字:primary key
- 当创建主键约束时,系统会默认在所在列和列组合上建立对应的唯一索引。
2.1 主键约束的操作
2.1.1 添加单列主键
创建单列主键有两种方式,一种是在定义字段的同时指定主键,另一种是定义完字段后再指定主键。
方式一:定义字段的同时指定主键,语法如下:
-- 在create table 语句中, 通过primary key 关键字来指定主键
create table 表名( ... <字段名> <数据类型> primary key ... );
方式二:定义完字段后再指定主键,语法如下:
-- 在定义完字段后再指定主键, 其中中括号的部分可以省略, 会默认取名
create table 表名( ... ... [constraint <约束名>] primary key(字段名) );
2.1.2 添加多列联合主键
联合主键,即该主键是由一张表中多个字段组成的。声明的联合主键中的字段组合是唯一且非空的即可。比如,将student表中的姓名、电话号码设置为联合主键,只要两人的姓名和电话号码不同时相同,即唯一。但是,联合主键中的每一个字段都不能为NULL。
【注意】:
当主键是由多个字段组成时,不能直接在字段名后声明主键约束。
一张表只能有一个主键,强调一个,联合主键也是一个主键。
语法:
create table 表名( ... ... primary key(字段1, 字段2, ..., 字段n) );
2.1.3 通过修改表结构的方式添加主键
主键约束不仅可以在创建表的同时创建,也可以在修改表时添加。
语法:
create table 表名( ... ... ); alter table <表名> add primary key(字段列表);
2.1.4 删除主键
一个表中不需要主键约束时,就需要从表中将其删除。
格式:
alter table <数据表名> drop primary key;
实现:
-- 删除单列主键或者联合主键,取决于table1中的主键类型 alter table table1 drop primary key;
3 自增长约束
概念:在MySQL中,当主键定义为自增长后,这个主键的值就不需要用户输入数据了,而由数据库系统根据定义自动赋值,每增加一条记录,主键会以相同的步长进行增长。
关键字:auto_increment
语法:
字段名 数据类型 auto_increment
实现样例:
create table student( id int primary key auto_increment, name varchar(20) );
【特点】:
默认情况下,auto_increment 的初始值为1,每增加一条记录,字段值自动加1;
一个表中只能有一个字段使用 auto_increment 约束,且该字段必须有唯一索引,以免序号重复(即为主键或者主键的一部分);
auto_increment 约束的字段必须具备 NOT NULL 属性;
auto_increment 约束的字段只能是整数类型(TINYINT、SMALLINT等);
auto_increment 约束的字段的最大值受该数据类型约束,如果达到上限, auto_increment 就会失效。
3.1 指定自增长字段的初始值
如果第一条记录设置了该字段的初始值,那么新增加的记录就从这个初始值开始自增。
方式一:创建表时指定
create table student( id int primary key auto_increment, name varchar(20) )auto_increment = 100;
方式二:创建表之后指定
create table student( id int primary key auto_increment, name varchar(20) ); alter table student auto_increment = 100;
3.1.1 delete和truncate在删除后自增列的变化
delete 数据之后自动增长从断点开始
truncate 数据之后自动增长从默认起始值开始
4 非空约束
概念:MySQL非空约束(not null)指字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统会报错。
语法:
方式1:<字段名> <数据类型> not null;
方式2:alter table 表名 modify 字段 类型 not null;
添加非空约束,方式1,创建表时指定:
create table student( id int, name varchar(20) not null, address varchar(20) not null );
添加非空约束,方式2,创建表后指定:
create table student( id int, name varchar(20), address varchar(20) ); alter table student modify name varchar(20) not null; alter table student modify address varchar(20) not null;
删除非空约束:
alter table student modify name varchar(20); alter table student modify address varchar(20);
5 唯一约束
概念:唯一约束是指所有记录中字段的值不能重复出现,但是可以都为NULL。
语法:
方式1:<字段名> <数据类型> unique;
方式2:alter table 表名 add constraint 约束名 unique(列);
例子,方式一,创建表时指定:
create table student( id int, name varchar(20), telephone varchar(20) unique -- 指定唯一约束 );
例子,方式二,创建表后以修改表结构形式指定:
create table student( id int, name varchar(20), telephone varchar(20) ); alter table student add constraint unique_phone unique(telephone);
删除唯一约束:
alter table <表名> drop index <约束名>;
6 默认约束
概念:MySQL默认约束用来指定某列的默认值,但是当赋值为NULL时,值依然为NULL。
语法:
方式1:<字段名> <数据类型> default<默认值>;
方式2:alter table 表名 modify 列名 类型 default <默认值>;
例子,方式一,创建表时指定:
create table student( id int, name varchar(20), address varchar(20) default '北京' -- 指定默认约束 );
例子,方式二,创建表后以修改表结构形式指定:
create table student( id int, name varchar(20), address varchar(20) ); alter table student modify address default '北京';
删除默认约束:
alter table <表名> change column <字段名> <类型> default null;
alter table <表名> modify <字段名> <类型> default null;
7 零填充约束(zerofill)
概念:
1.插入数据时,当该字段的值的长度小于定义的长度时,会在该值的前面补上0;
2.zerofill 默认为int(10);
3.当使用zerofill时,默认会自动添加unsigned 属性。
实现例子:
create table student( id int zerofill, -- 零填充约束 name varchar(20) );
删除操作:
alter table <表名> modify <字段名> <类型>;