Oracle兼容-语法-索引中NULL视为相同值
1. 语法
1. SET sql_mode = ORACLE;
2. 定义和用法
在GreatSQL原生 DEFAULT 模式下,唯一索引(UNIQUE KEY)中的 NULL 被视为不同值。
当切换到 ORACLE 模式下之后,唯一索引中的 NULL 就会被视为相同值了。
此外,在 ORACLE 模式下,唯一索引可能会报告 NULL 值重复冲突。
3. Oracle兼容说明
- 切换到
ORACLE模式下之后,新创建的唯一索引会对NULL视为相同值处理,而在切换模式前已经存在的唯一索引则保持不变。 - 仅InnoDB引擎支持该特性。
4. 示例
1. greatsql> SET sql_mode = ORACLE;
3. greatsql> CREATE TABLE t1 (i1 INT, i2 INT);
5. greatsql> CREATE UNIQUE INDEX t1_i1_i2 ON t1(i1, i2);
7. -- 再次插入相同记录会报错
8. greatsql> INSERT INTO t1 VALUES (1, null);
9. greatsql> INSERT INTO t1 VALUES (1, null);
10. ERROR 1062 (23000): Duplicate entry '1-NULL' for key 't1.t1_i1_i2'
12. greatsql> INSERT INTO t1 VALUES (2, null);
13. greatsql> INSERT INTO t1 VALUES (2, null);
14. ERROR 1062 (23000): Duplicate entry '2-NULL' for key 't1.t1_i1_i2'
16. greatsql> INSERT INTO t1 VALUES (null, 1);
17. greatsql> INSERT INTO t1 VALUES (null, 1);
18. ERROR 1062 (23000): Duplicate entry 'NULL-1' for key 't1.t1_i1_i2'
20. greatsql> INSERT INTO t1 VALUES (null, null);
21. greatsql> INSERT INTO t1 VALUES (null, null);
22. ERROR 1062 (23000): Duplicate entry 'NULL-NULL' for key 't1.t1_i1_i2'
24. -- 即便切换到DEFAULT模式,再插入相同记录也会报错
25. greatsql> SET sql_mode = DEFAULT;
27. greatsql> INSERT INTO t1 VALUES (null, null);
28. ERROR 1062 (23000): Duplicate entry 'NULL-NULL' for key 't1.t1_i1_i2'
30. greatsql> INSERT INTO t1 VALUES (2, null);
31. ERROR 1062 (23000): Duplicate entry '2-NULL' for key 't1.t1_i1_i2'
33. greatsql> SELECT * FROM t1;
34. +------+------+
35. | i1 | i2 |
36. +------+------+
37. | NULL | NULL |
38. | NULL | 1 |
39. | 1 | NULL |
40. | 2 | NULL |
41. +------+------+
问题反馈
联系我们
扫码关注微信公众号

