MySQL 学习笔记

MySQL是一个开源的关系型数据库,非常流行。

如无特殊说明,本专题文章的 SQL 均在 5.6 版本中验证。

👉文章列表
MySQL 学习笔记 ⏬ 创建和删除数据库 切换和查看数据库 创建和删除表 在表中增加、删除、修改列 添加和删除索引 增删查改 创建和删除主键 大小写和反引号 字符串类型值的大小写 SQL注释 CHAR类型 VARCHAR类型 整型数字 时间戳 不要使用utf8 唯一索引与NULL 唯一索引的单列长度限制 NULL的判等 DDL、DML、DCL的含义 查看表的状态 show table status InnoDB存储引擎的限制 if和case的使用 自定义函数 InnoDB 索引 事务 事务隔离级别的概念、查看和修改 读已提交(read committed)隔离级别下的锁 可重复读(repeatable read)隔离级别下的锁 修改自增主键id的类型 使用 load data 快速导入数据 使用 select into outfile 导出数据

MySQL: 唯一索引与NULL


null破坏了唯一性。我们用示例看下如何破坏的。

单列唯一

创建表,c1列加上唯一索引:

create table test_table (
    c1 CHAR(2),
    UNIQUE KEY uk_c1(c1)
) engine = InnoDB character set = utf8mb4;

虽然 c1 列被设置为保证唯一性,但对 NULL 是无效的,即可以插入多条 NULL 数据。我们看下效果:

步骤 执行的SQL 结果
1 insert into test_table(c1) values('你好'); 成功
2 insert into test_table(c1) values('你好'); 失败,报错 (1062, u"Duplicate entry '\u4f60\u597d' for key 'uk_c1'")
3 insert into test_table(c1) values(NULL); 成功
4 insert into test_table(c1) values(NULL); 成功

查看下表中数据:

mysql> select * from test_table;
+--------+
| c1     |
+--------+
| <null> |
| <null> |
| 你好   |
+--------+

多列唯一

创建表,c1和c2列加上联合的唯一索引。

create table test_table (
    c1 CHAR(2),
    c2 CHAR(2),
    UNIQUE KEY uk_c1_c2(c1, c2)
) engine = InnoDB character set = utf8mb4;

当有数据为null时,唯一性无法满足。

步骤 执行的SQL 结果
1 insert into test_table(c1, c2) values('你好', '世界'); 成功
2 insert into test_table(c1, c2) values('你好', '世界'); 执行失败,报错 (1062, u"Duplicate entry '\u4f60\u597d-\u4e16\u754c' for key 'uk_c1_c2'")
3 insert into test_table(c1, c2) values('你好', null); 成功
4 insert into test_table(c1, c2) values('你好', null); 成功
5 insert into test_table(c1, c2) values(null, null); 成功
6 insert into test_table(c1, c2) values(null, null); 成功

查看表中数据:

mysql> select * from test_table;
+--------+--------+
| c1     | c2     |
+--------+--------+
| <null> | <null> |
| <null> | <null> |
| 你好   | <null> |
| 你好   | <null> |
| 你好   | 世界   |
+--------+--------+

null破坏了唯一性,怎么办?

当唯一列出现null时,唯一性得不到满足,怎么办?

  1. 不允许列出现 null 值,即not null
  2. 给列增加 default 值,注意default值不能是 null。

( 本文完 )

文章目录