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、如果添加数据时,给自增长字段(列)指定的有值,则以指定的值为准,如果指定自增长,一般来说,就按照自增长的规则来添加数据

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值