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