Mysql基础(四)约束
基本介绍:
约束用于确保数据库的数据满足特定的商业规则。在mysql中,约束包括:not null、unique、primary key、foreign key 和 check 五种
一、primary key(主键)
基本介绍:用于唯一的标识表行的数据,当定义主键约束后,该列不能重复
create table t17(
id int primary key, -- 表示id列为主键,不可重复
`name` varchar(32),
email varchar(32)
)
insert into t17 values(1,'jack','12312@qq.com')
insert into t17 values(2,'tom','tom@qq.com')
-- 报错,主键是唯一的值
insert into t17 values(1,'lucy','lucy@qq.com')
细节说明:
1、primary key 不能重复而且不能为null
2、一张表最多只能有一个主键,但是可以是复合主键
create table t20(
id int,
`name` varchar(32),
email varchar(32),
-- 复合主键
primary key(id,`name`)
)
复合主键,在 primary key 中添加主键名,插入数据如果是 id、name (复合主键的值)都相同才会违反主键的唯一性
3、主键的指定方式有两种
-
直接在字段名后指定:字段名 primary key
create table t17( id int primary key, -- 表示id列为主键,不可重复 `name` varchar(32), email varchar(32) )
-
在表定义最后写 primary key(列名)
create table t18( id int, -- 表示id列为主键,不可重复 `name` varchar(32), email varchar(32), primary key(id) )
4、使用 desc 表名,可以看到 primary key 的情况
二、not null(非空)
说明:如果在列上定义了not null,那么当插入数据时,必须为该列提供数据
字段名 字段类型 not null
三、unique(唯一)
说明:当定义了唯一约束后,该列值不能重复
字段名 字段类型 unique
create table t21(
id int unique, -- 表示id列不能重复
`name` varchar(32),
email varchar(32)
)
-- 可以添加
insert into t21 values(1,'lucy','lucy@qq.com')
-- 不可以添加,id已经重复,unique指定的是唯一的值
insert into t21 values(1,'tom','tom@qq.com')
-- 如果列上没有做 not null 约束,那么 null 是可以添加多个
insert into t21 values(null,'tom','tom@qq.com')
insert into t21 values(null,'tom','tom@qq.com')
insert into t21 values(null,'tom','tom@qq.com')
select * from t21
细节:
1、如果没有指定 not null,则 unique 字段可以有多个 null
2、一张表可以有很多个 unique 字段
3、unique not null 组合使用的效果类似主键,列不能重复、不能为空、还是唯一标识
四、(foreign key)外键
说明:用于定义主表和从表之间的关系,外键约束要定义在从表上,主表则必须具有主键约束或者unique约束,当定义外键约束后,要求外键列数据必须在主表的主键列存在或者是为 null
foreign key(本表字段名) references 主表名(主键名或unique字段名)
-- 创建主表(班级表)
create table my_class(
id int primary key,
class_name varchar(32) not null default '',
address varchar(32)
)
-- 创建从表(学生表)
create table my_stu(
id int primary key,
`name` varchar(32) not null default '',
class_id int,
-- 指定外键
foreign key(class_id) references my_class(id)
)
insert into my_class values(1001,'java01','上海'),(1002,'mysql01','北京')
select * from my_class
-- 插入成功
insert into my_stu values(1,'张三',1001)
insert into my_stu values(2,'李四',1002)
-- 插入失败,受到外键约束,主表没有1003这条数据
insert into my_stu values(3,'王五',1003)
-- 删除失败,要想删除主表的数据
-- 首先将指向这条记录的从表记录全部删除,才可将主表的记录删除
delete from my_class
where id = 1001
select * from my_stu
使用细节:
1、外键指向的表字段,要求是 primary key 或者是 unique
2、表类型是 innodb,这样的表才能支持外键
3、外键字段的类型要和主键字段类型一致(长度可以不同)
4、外键字段的值,必须在主键字段中出现过,或者为 null 【前提是外键字段允许为 null】
5、一旦建立主外键关系,数据不能随意删除
五、check
说明:用于强制行数据必须满足的条件,假定在 sal 列上定义了 check 约束,并要求 sal 列的值在1000 ~ 2000 之间,如果不在这个范围内就会提示错误
oracle 和 sql server 均支持 check,但是 mysql 5.7 目前还不支持 check,只做语法校验,但不会生效
字段名 字段类型 check(check条件)
六、自增长
说明:在某张表中,存在一个id列(整数),我们希望在添加记录的时候,该列从1开始,自动的这个增长
字段名 整形 primary key auto_increment
-- 插入数据时
insert into table_name(字段1,字段2,字段3) values(null,值2,值3)
insert into table_name(字段2,字段3) values(值1,值2)
insert into table_name values(null,值1,值2)
细节:
1、一般来说自增长是和 primary key 配合使用的
2、自增长也可以单独使用【但是需要配合一个unique】
3、自增长修饰的字段为整数型,虽然小数也可以但是很少这样使用
4、自增长默认从1开始,你也可以通过如下命令修改,自增长的开始值就会从修改的值开始往上增长
alter table table_name auto_increment = xxx
5、如果添加数据时,给自增长字段(列)指定的有值,则以指定的值为准,如果指定自增长,一般来说,就按照自增长的规则来添加数据