MySQL:表的约束(下)

文章目录

自增长

下面介绍的是自增长字段,约束条件是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信息会依次增长,这就是自增长的约束条件

自增长的特点:

  1. 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
  2. 自增长字段必须是整数
  3. 一张表最多只能有一个自增长

唯一键

这里可能需要区分一下唯一键和主键的概念,主键的意思更多是用来进行标识唯一性的,而唯一键更多是用来进行保证业务上,不能和其他的信息出现重复

比如说,在一个管理系统当中,我们选择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是一一对应的

相关推荐

最近更新

  1. Linux系统基础命令行指令——Ubuntu

    2024-04-09 08:28:05       0 阅读
  2. 【Android高级UI】计算不规则图形面积

    2024-04-09 08:28:05       0 阅读
  3. Python库 - PyMC3

    2024-04-09 08:28:05       0 阅读
  4. C语言中关键字

    2024-04-09 08:28:05       0 阅读
  5. ios CCPlistFileWritter.m

    2024-04-09 08:28:05       0 阅读
  6. C#实现Winform程序右下角弹窗消息提示

    2024-04-09 08:28:05       0 阅读
  7. 【PyTorch单点知识】自动求导机制的原理与实践

    2024-04-09 08:28:05       0 阅读

热门阅读

  1. MySQL_5.7.17的安装与配置

    2024-04-09 08:28:05       16 阅读
  2. MySQL-9. 事务

    2024-04-09 08:28:05       15 阅读
  3. 【备忘录】MySQL 8.3 中删除的功能

    2024-04-09 08:28:05       15 阅读
  4. 4.8QT

    4.8QT

    2024-04-09 08:28:05      13 阅读
  5. 冒泡排序算法实现步骤

    2024-04-09 08:28:05       15 阅读
  6. [leetcode] 110. 平衡二叉树

    2024-04-09 08:28:05       12 阅读
  7. C语言函数指针:编程的“瑞士军刀”

    2024-04-09 08:28:05       17 阅读
  8. 论文复现 关于计算痤疮数量来进行分类

    2024-04-09 08:28:05       17 阅读