文章目录
- 自增长
- 唯一键
- 外键
自增长
下面介绍的是自增长字段,约束条件是auto_increment,意思就是说是自动进行增长,通常可以用在序号等,可以自动进行增长:
mysql> create table tt1 (
-> id int unsigned primary key auto_increment,
-> name varchar(20) not null
-> );
Query OK, 0 rows affected (0.10 sec)
mysql> desc tt1;
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
+-------+--------------+------+-----+---------+----------------+
2 rows in set (0.05 sec)
那么这样就建好这个表了,那么具体是如何进行自增长的呢?
mysql> insert into tt1 (name) values('小明');
Query OK, 1 row affected (0.02 sec)
mysql> insert into tt1 (name) values('小红');
Query OK, 1 row affected (0.01 sec)
mysql> insert into tt1 (name) values('小刚');
Query OK, 1 row affected (0.01 sec)
mysql> select *from tt1;
+----+--------+
| id | name |
+----+--------+
| 1 | 小明 |
| 2 | 小红 |
| 3 | 小刚 |
+----+--------+
3 rows in set (0.00 sec)
如上所示,当插入三个人的名字信息之后,此时的id信息会依次增长,这就是自增长的约束条件
自增长的特点:
- 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
- 自增长字段必须是整数
- 一张表最多只能有一个自增长
唯一键
这里可能需要区分一下唯一键和主键的概念,主键的意思更多是用来进行标识唯一性的,而唯一键更多是用来进行保证业务上,不能和其他的信息出现重复
比如说,在一个管理系统当中,我们选择ID号作为主键,但是可能对于读者的身份证信息也需要保证唯一性,那么此时就可以把身份证信息作为一个唯一键,具体如下所示:
mysql> create table tt2 ( id int unsigned primary key, qq char(10) unique, name
varchar(20) );
Query OK, 0 rows affected (0.07 sec)
mysql> desc tt2;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id | int unsigned | NO | PRI | NULL | |
| qq | char(10) | YES | UNI | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> insert into tt2 (id, qq, name) values(10, 123123, '小明');
Query OK, 1 row affected (0.00 sec)
mysql> insert into tt2 (id, qq, name) values(10, 12312, '小亮');
ERROR 1062 (23000): Duplicate entry '10' for key 'tt2.PRIMARY'
mysql> insert into tt2 (id, qq, name) values(11, 12312, '小亮');
Query OK, 1 row affected (0.01 sec)
mysql> insert into tt2 (id, qq, name) values(11, 12312, '小红');
ERROR 1062 (23000): Duplicate entry '11' for key 'tt2.PRIMARY'
mysql> insert into tt2 (id, qq, name) values(11, 123121, '小红');
ERROR 1062 (23000): Duplicate entry '11' for key 'tt2.PRIMARY'
mysql> insert into tt2 (id, qq, name) values(12, 123121, '小红');
Query OK, 1 row affected (0.01 sec)
mysql> select *from tt2;
+----+--------+--------+
| id | qq | name |
+----+--------+--------+
| 10 | 123123 | 小明 |
| 11 | 12312 | 小亮 |
| 12 | 123121 | 小红 |
+----+--------+--------+
3 rows in set (0.00 sec)
由此可见,主键和唯一键都可以保证唯一性,不过主键和唯一键的侧重点不一样
外键
外键用来定义主表和从表之间的关系,外键约束主要在从表上定义,而主表则必须是有主键或者唯一键进行约束,定义外键后,要求外键列数据必须在主表的主键列存在或者是null
比如我们现在有这样的表
那么对于上述的这个表,我们可以这样进行创建
首先要创建出主键表和从表
mysql> create table myclass (
-> id int primary key,
-> name varchar(20) not null
-> );
Query OK, 0 rows affected (0.02 sec)
mysql> create table stu (
-> id int primary key,
-> name varchar(30) not null,
-> class_id int,
-> foreign key (class_id) references myclass(id)
-> );
Query OK, 0 rows affected (0.06 sec)
其次进行数据插入,先插入正常的数据
mysql> insert into stu (id, name, class_id) values(100, '张三', 10);
Query OK, 1 row affected (0.00 sec)
mysql> insert into stu (id, name, class_id) values(101, '李四', 20);
Query OK, 1 row affected (0.01 sec)
再插一个异常数据:
mysql> insert into stu (id, name, class_id) values(102, '王五', 30);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`base1`.`stu`, CONSTRAINT `stu_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `myclass` (`id`))
为什么错误?原因就是因为在是不存在id位30的班级的,必须要先创建id为30的班级,此时就可以正常插入了:
mysql> insert into myclass values(30, 'python');
Query OK, 1 row affected (0.01 sec)
mysql> insert into stu (id, name, class_id) values(102, '王五', 30);
Query OK, 1 row affected (0.01 sec)
看一下整体的结构:
mysql> select *from myclass;
+----+--------+
| id | name |
+----+--------+
| 10 | C++ |
| 20 | java |
| 30 | python |
+----+--------+
3 rows in set (0.00 sec)
mysql> select *from stu;
+-----+--------+----------+
| id | name | class_id |
+-----+--------+----------+
| 100 | 张三 | 10 |
| 101 | 李四 | 20 |
| 102 | 王五 | 30 |
+-----+--------+----------+
3 rows in set (0.00 sec)
class id和id是一一对应的