目录
一、主键约束(primary key)PK
MySQL主键约束是一个列或者多个列的组合,其值能唯一地标识表中的每一行,方便尽快的找到某一行。主键约束相当于 唯一约束 + 非空约束 的组合,主键约束列不允许重复,也不允许出现空值。每个表最多只允许一个主键。主键约束的关键字是:primary key,当创建主键的约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。
1.添加单列主键
(1)定义字段的同时指定主键
语法格式:
create table 表名(
...
<字段名> <数据类型> primary key
...
)
例如现在我们创建一个emp1
表,然后给eid
属性指定主键:
在左侧窗口打开emp1
表,然后选择设计表,可以看到:
成功给eid
设置了主键。我们也可以直接打开设计表在键这一列进行设置
(2)定义字段之后在指定主键
create table 表名(
...
[constraint <约束名>] primary key [字段名]
);
例如现在创建一个epm2表,然后定义字段后再给eid属性指定主键:
打开该表选择设计表
也成功给eid
设置了主键。
可以看到,这两种方法都可以设置主键,而且并没有优劣之分,那么加不加主键到底有什么区别呢?
以我们创建的epm2
为例,现在给表中添加一行数据,如下
但是我们如果在添加一行eid也是101的话就会报错:
这是因为主键约束所在的列值不能重复
我们在创建一行,让主键约束所在的列的值为空:
我们可以看到也会报错报错原因是因为主键约束所在列的值不能为空
2.添加多列联合主键
所谓的联合主键,就是这个主键是由一张表中多个字段组成的。
注意:
- 当主键是由多个字段组成时,不能直接在字段名后面声明主键约束。
- 一张表只能有一个主键,联合主键也是一个主键
语法格式:
create table 表名(
...
primary key (字段1,字段2,…,字段n)
);
例如现在创建一个emp3
表,然后给eid
和deptId
属性指定主键
主键设置成功,我们现在添加一行数据:
重复刚才的操作:
果然会报错,如果我们只是让name
重复呢?再添加一行:
此时就可以添加,说明联合主键约束所在列的值不能同时重复。
如果让那么为空或者deptId为空呢?
都会报错,说明联合主键约束所在列的值都不能为空
3.通过修改表结构添加主键
create table 表名(
...
);
alter table <表名> add primary key(字段列表);
之前都是在创建表的时候我们就已经添加了主键,现在我们先创建表再添加主键
4.删除主键
一个表中不需要主键约束时,就需要从表中将其删除。删除主键约束的方法要比创建主键约束容易的多。
语法格式:
alter table <数据表名> drop primary key;
同时,也不用区分是单列主键还是联合主键,都可以采用上述代码删除主键。例如,删除emp1
的主键:
二、自增长约束(auto_increment)
在 MySQL 中,当主键定义为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值。每增加一条记录,主键会自动以相同的步长进行增长。通过给字段添加auto_increment
属性来实现主键自增长。
1.自增长约束的特点
- 默认情况下,auto_increment的初始值是 1,每新增一条记录,字段值自动加 1。
- 一个表中只能有一个字段使用 auto_increment约束,且该字段必须有唯一索引,以避免序号重复(即为主键或主键的一部分)。
- auto_increment约束的字段必须具备非空属性。
- auto_increment约束的字段只能是整数类型。
- auto_increment约束字段的最大值受该字段的数据类型约束,如果达到上限,
- auto_increment`就会失效。
2.默认自增长方式
语法格式:
字段名 数据类型 auto_increment
例如:先创建一个user1
表,给它的id
属性先添加一个主键,在将主键定义为自增长:
创建成功,现在只给他的name赋值:
可以发现,在没有给id
赋值的情况下,id
的值会随着我们添加的数据项从1开始自增的。
3.指定自增字段初始值
如果第一条记录设置了该字段的初始值,那么新增加的记录就从这个初始值开始自增。例如,如果表中插入的第一条记录的 id 值设置为 5,那么再插入记录时,id 值就会从 5 开始往上增加。
(1)创建表时指定
例如现在新创建一个user3
表,在创建的过程中指定主键值从100开始自增:
可以发现id
值从100开始自增
(2)创建表后指定
创建一个emp5表,创建完成后指定主键值从200开始自增:
创建成功,现在只给name
插入数据
可以发现id
值从200开始自增。
(3)delete删除后自增列的变化
我们操作user1
,通过delete
将表内的数据删除,然后在给他添加一行数据
可以发现:delete数据之后自动增长从断点开始
(4)truncake删除后自增列的变化
继续操作user1
,通过truncate
方法将表删除再添加数据
可以发现:truncate
数据之后自动增长从默认起始值开始
三、非空约束
MySQL 非空约束(not null)指字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统就会报错。
1.创建表时指定
语法格式:
<字段名><数据类型> not null;
例如现在我们在创建一个user4
,在创建表时给其name
和address
添加非空约束。
打开设计表可以看到
name
和address
都在【不是null】选项中选中,说明指定成功,在添加一行数据试试:
发现,当我们只给name
赋值的时候,会出现错误,提示address
没有值。所以非空约束条件下字段的值不能为空。
2.创建表之后指定
alter table 表名 modify 字段 类型 not null;
再创建一个user5
,创建完成后给name
和address
添加非空约束。
和上面一样如果我们没有给name
赋值的话,还是会提示错误
3.删除非空约束
语法格式:
alter table 表名 modify 字段 类型
例如删除user4
表的非空约束,然后通过dec table
显示结果,可以看到这里的null
可以为yes
,即可以为空,表示删除成功。
四、唯一性约束(unique)
唯一约束(Unique Key)是指所有记录中字段的值不能重复出现。例如,为 id 字段加上唯一性约束后,每条记录的 id 值都是唯一的,不能出现重复的情况。
1.创建表时指定
语法格式:
<字段名> <数据类型> unique
添加一行数据,再添加一行数据让新添加的phone_number
和上一行数据的phone_number
相同:
添加失败,因为唯一约束中字段的值不能重复出现。
2.创建表之后指定
alter table 表名 add constraint 约束名 unique(列);
效果和上面的相同
3.删除唯一约束
alter table <表名> drop index <唯一约束名>
我们现在删除user6中的唯一约束并测试
五、默认约束(default)
MySQL 默认值约束用来指定某列的默认值它有
1.指定默认约束
两种指定方式创建表时指定和创建表后指定
创建表时指定: <字段名> <数据类型> default <默认值>;
创建表后指定: alter table 表名 modify 列名 类型 default 默认值;
我们用两种方法分别创建de1和de2表,并添加数据
CREATE TABLE de1(
id int,
name varchar(20),
address varchar(20) DEFAULT '西安'
);
CREATE TABLE de2(
id int,
name varchar(20),
address varchar(20)
);
alter TABLE de2 MODIFY address VARCHAR(20) DEFAULT'西安';
INSERT into de1 (id,name) VALUES(101,'李四');
INSERT into de2 (id,name) VALUES(101,'李四');
两个结果是一样的,没有给指定值得时候他的值被默认添加了西安
当我们给address 赋值后会改变他的默认值变为山西
2.删除默认约束
语法格式
alter table <表名> modify column <字段名> <类型> default null;
删除de2的默认约束并给其新建一行数据
发现,新添加的行中也没有给address
指定值,它显示为null
,说明删除成功。
六、零填充约束(zerofill)
1、插入数据时,当该字段的值的长度小于定义的长度时,会在该值的前面补上相应的0
2、zerofill默认为int(10)
3、当使用zerofill 时,默认会自动加unsigned(无符号)属性,使用unsigned属性后,数值范围是原值的2倍,例如,有符号为-128~ +127,无符号为0~256。
1.添加零填充约束
例如现在我们新创建一个表user10
,给id
添加零填充约束,并添加数据
可以发现,我们填充的id
值会被默认改为10位。
2.删除零填充约束
ALTER TABLE 表名 MODIFY 字段名 数据类型;
可以发现我们填充的id
值变为了我们输入的值,表示删除成功