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