MySQL 基础之十三:约束
![MySQL基础之十三:约束](https://static001.geekbang.org/infoq/d9/d918f8a6016d9bc91e2e538cd4d43ebb.jpeg)
主要内容:
本篇内容主要讲解一下建表时的各种约束。
约束分类:
在进行约束分类之前,先弄明白约束是什么?
在创建表的时候,我们可以给表的字段添加相应的约束,添加约束的目的就是为了保证表中数据的合法性,有效性,完整性。
比如在银行系统中,银行卡号就必须独一无二,不能重复,因此就必须给银行卡号对应的字段加上相应的约束。
下面简单介绍一下常见的约束都有哪些?
非空约束(not null):约束字段的值不能为 null
唯一约束(unique):值不能重复
主键约束(primary key):既不能为 null,也不能重复(简称 PK)
外键约束(foreign key)
检查约束(check):ORACLE 数据库中有这个约束,mysql 中没有
非空约束:
这个其实很好理解,就是非空约束的字段对用的值不能为空。比如我们在建一个账号表时,用户名不能为空吧,只有填写了用户名,才可以接着填写其他信息,然后进行注册。只要在建表语句中子段后面加上 not null 就行。
唯一性约束:
唯一性约束的字段具有唯一性,不能重复,但是可以为 null。
列级约束:
username varchar(255) unique,
password varchar(255) unique,
列级约束就是给单个的子段添加唯一性约束。
表级约束:
username varchar(255),
password varchar(255),
unique(username,password),
如果 username=mary,password=123;和 username=mary,password=456,这两个用户符合唯一性约束,也就是说 username 和 password 两个字段值合起来不完全一样就符合唯一性约束。
主键约束:
主键有什么作用:
表的设计三范式之一:要求任何一个表都应该有主键。
主键的作用:主键值是记录在这张表中的唯一标识。
主键的相关术语:
主键约束
主键字段:被主键约束的字段
主键值:每一行记录中主键字段对应的值
主键分类:
根据主键字段的字段数量来进行划分:
单一主键
复合主键:多个字段联合起来添加为一个主键约束---->这种不推荐
根据主键性质来划分:
自然主键:1,2,3,自增的这种
业务主键:主键值和系统的业务挂钩---->不推荐
小贴士:一张表的主键只能有一个
mysql 提供主键值自增:
mysql> drop table if exists t_user;
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> create table t_user(
-> id int key auto_increment,
-> username varchar(255)
-> );
Query OK, 0 rows affected (0.13 sec)
mysql> insert into t_user(username) values('a');
Query OK, 1 row affected (0.03 sec)
mysql> select * from t_user;
+----+----------+
| id | username |
+----+----------+
| 1 | a |
+----+----------+
1 row in set (0.01 sec)
auto_increment:自动维护一个自增的数字,从 1 开始。
外键约束:
外键值可以为 null 吗?
可以。
外键约束引用的其他表的字段时,被引用的字段必须是主键吗?
不一定,但是必须保证至少具有 unique 约束。
mysql> drop table if exists t_student; // 子表
mysql> drop table if exists t_class; //父表
mysql> create table t_class(
-> cno int,
-> cname varchar(255),
-> primary key (cno)
-> );
Query OK, 0 rows affected (0.07 sec)
mysql> create table t_student(
-> sno int,
-> sname varchar(255),
-> classno int,
-> foreign key(classno) references t_class(cno)
-> );
Query OK, 0 rows affected (0.10 sec)
foreign key(classno) references t_class(cno):就是 t_student 表使用外键把 t_class 表的主键 cno 引用为自己的主键。
版权声明: 本文为 InfoQ 作者【打工人!】的原创文章。
原文链接:【http://xie.infoq.cn/article/621672ecc35ce5d8ba38a11f3】。文章转载请联系作者。
评论