Mysql基础(四)约束

基本介绍:

约束用于确保数据库的数据满足特定的商业规则。在mysql中,约束包括:not null、unique、primary key、foreign key 和 check 五种

一、primary key(主键)

基本介绍:用于唯一的标识表行的数据,当定义主键约束后,该列不能重复

copy
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、一张表最多只能有一个主键,但是可以是复合主键

copy
create table t20( id int, `name` varchar(32), email varchar(32), -- 复合主键 primary key(id,`name`) )

复合主键,在 primary key 中添加主键名,插入数据如果是 id、name (复合主键的值)都相同才会违反主键的唯一性

3、主键的指定方式有两种

  • 直接在字段名后指定:字段名 primary key

    copy
    create table t17( id int primary key, -- 表示id列为主键,不可重复 `name` varchar(32), email varchar(32) )
  • 在表定义最后写 primary key(列名)

    copy
    create table t18( id int, -- 表示id列为主键,不可重复 `name` varchar(32), email varchar(32), primary key(id) )

4、使用 desc 表名,可以看到 primary key 的情况

二、not null(非空)

说明:如果在列上定义了not null,那么当插入数据时,必须为该列提供数据

copy
字段名 字段类型 not null

三、unique(唯一)

说明:当定义了唯一约束后,该列值不能重复

copy
字段名 字段类型 unique
copy
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

copy
foreign key(本表字段名) references 主表名(主键名或unique字段名)
copy
-- 创建主表(班级表) 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,只做语法校验,但不会生效

copy
字段名 字段类型 check(check条件)

六、自增长

说明:在某张表中,存在一个id列(整数),我们希望在添加记录的时候,该列从1开始,自动的这个增长

copy
字段名 整形 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开始,你也可以通过如下命令修改,自增长的开始值就会从修改的值开始往上增长

copy
alter table table_name auto_increment = xxx

5、如果添加数据时,给自增长字段(列)指定的有值,则以指定的值为准,如果指定自增长,一般来说,就按照自增长的规则来添加数据

posted @   花椒蛋炒饭  阅读(64)  评论(0编辑  收藏  举报
相关博文:
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起