一、约束(constraint)
约束实际上就是表中数据的限制条件
作用:
保证表中记录完整性和有效性,比如用户表有些列的值(手机号)不能为空,有些列的值(身份证件号)不能重复。
主键约束(primary key)PK
自增长约束 (auto_increment)
非空约束 (not null)
唯一性约束(unique)
默认约束(default)
零填充约束(zerofill)
外键约束(foreign key) FK
1、主键约束(关键字:primary key)
1)MySQL主键约束:
一个列或者多个列的组合,其值能唯一的标识表中的每一行,方便在RDMS中尽快的找到某一行。
主键约束相当于唯一约束+非空约束 的组合,主键约束列不允许重复,也不允许出现空值。
每个表最多只允许一个主键
当创建主键的约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。
可以在创建表的同时创建,也可以在修改表时添加
操作:
法1:
-- 在create table 语句中,通过PRIMARY key 关键字来指定主键。
-- 在定义字段的同时指定主键,语法格式如下:
create table 表名(
...
<字段名><数据类型> primary key,
...
);
示例:
create table emp(
eid int primary key,
name varchar(20),
deptId int,
salary double
);
法2:
--在定义地段之后再制定主键,语法格式如下:
create table 表名(
...
[constraint <约束名>] primary key [字段名]
);
示例
create table emp2(
eid INT,
name varchar(20),
deptId INT,
salary double,
constraint pk1 primary key(id)
);
2)联合主键(添加多列主键)
联合主键:这个主键是由一张表中多个字段组成
注意:
当主键是由多个字段组成时,不能直接在字段后面声明主键约束
一张表只能有一个主键,联合主键也是一个主键
语法
create table 表名(
...
primary key (字段1,字段2,...,字段n)
);
示例
create table emp3(
name varchar(20),
deptId int,
salary double,
primary key(name,deptId)
);
3)修改主键
create table 表名(
...
);
alter table <表名> add primary key (字段列表);
示例
create table emp4(
eid int,
name varchar(20),
deptId int,
salary double
);
alter table emp4 add primary key(eid);
-- 联合
alter table emp4 add primary key(eid,name);
4)删除主键
格式:
alter table <数据表名> drop primary key;
示例:
(删除主键约束后,还是会有非空约束在的)
--删除单列主键
alter table emp1 drop primary key;
--删除非空约束(sid)
alter table emp1 modify sid int;
-- 删除联合主键
alter table emp5 drop primary key;
2、自增长约束(auto_increment)
1)概念:
当主键定义为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值。每增加一条记录,主键会自动以相同的步长进行增长。
特点:
初始值是1,自动加1
一个表中只能有一个字段使用,且必须有唯一索引(是主键或为主键的一部分【避免序号重复】)。
所约束字段必须具备not null属性。
只能是整数类型
所约束字段最大值受该字段的数据类型约束,如果达到上限,auto_increment就会失效。
语法:
字段名 数据类型 auto_increment
示例:
-- 创建表时指定
create table t_user1(
id int primary key auto_increment,
name varchar(20)
)auto_increment = 100;
-- 创建表之后指定
create table t_user1(
id int primary key auto_increment,
name varchar(20)
);
alter table t_user2 auto_increment =100;
2)删除自增列
delete数据之后自动增长从断点开始
delete from t_user1;
truncate数据之后自动增长从默认起始值开始
truncate t_user1;
3、非空约束(not null)
1)概念:
字段的值不能为空,添加值没有指定值时,数据库系统会报错。
语法:
方式1:<字段名> <数据类型> not null;
方式2:alter table 表名 modify 字段 类型 not null;
示例:
--方式1
create table t_user6(
id int,
name varchar(20) not null,
address varchar(20) not null
):
--方法2:后续添加
create table t_user6(
id int,
name varchar(20),
address varchar(20)
);
alter table t_user modify name varchar(20) not null;
alter table t_user modify address varchar(20) not null;
2)删除非空约束
-- alter table 表名 modify 字段 类型
alter table t_user7 modify name varchar(20);
alter table t_user7 modify address varchar(20);
4、唯一约束(unique)
1)概念:
唯一,所有记录中字段的值不能出现重复。可以为空(null和任何值都不相同,可以有多个null)
语法:
方式1:<字段名> <数据类型>unique
方式2:alter table 表名 add constraint 约束名 unique(列);
示例
--创建表时指定
create table t_user8(
id int,
name varchar(20),
phone_number varchar(20) unique --指定唯一约束
);
--后续添加
create table t_user8(
id int,
name varchar(20),
phone_number varchar(20) --指定唯一约束
);
alter table t_user8 add cconstraint unique_pn unique(phone_number);
2)删除唯一约束
语法
alter table <表名> drop index <唯一约束名>;
示例
alter table t_user9 drop index unique_pn;
5、默认约束(default)
1)概念:
指定某列的默认值
语法:
--方式1:<> <> defaule <>;
--方式2:alter table 表名 modify 列名 类型 default 默认值;
示例:
-- 方式1
create table t_user10(
id int,
name varchar(20),
address varcchar(20) defaule '北京' --指定默认值
);
-- 方式2
create table t_user10(
id int,
name varchar(20),
address varcchar(20)
);
alter table t_user10 modify address varchar(20) default '北京';
2)删除默认值
语法:
alter table <表名> change column <字段名> <类型> default null;
示例:
alter table t_user11 modify address varchar(20) default null;
6、零填充约束(zerofill)
1)概念:
插入数据时,该字段的值的长度小于定义的长度时,会在该值的前面补上对应的0
zerofill默认为int(10)
当使用zero时,默认会自动加unsigned(无符号)属性,使用unsigned属性后,数值范围是原值的2倍,例如,有符号为-128~+127,无符号为0~256。
语法
create table t_user12(
id int zerofill, -- 零填充约束
name varchar(20)
);
2)删除
alter table t_user12 modify id int;