create unique index on null columns

drop table emp;
CREATE TABLE emp (empid INT, name VARCHAR(10), phone BIGINT);  
insert into emp values(1,'John',9055551234);
insert into emp values(2,'Jack',4165554321);
insert into emp values(3,'Jill',null);
insert into emp values(4,'James',6475559876);
insert into emp values(5,'Jeremy',null);

想在phone这个列上建一个unique index,但是不能成功,因为有2行的值是null,注意,如果只有一行是null,是可以成功的。
CREATE UNIQUE INDEX phoneidx ON emp(phone);
A unique index cannot be created because the table contains data that would result in duplicate index entries.. SQLCODE=-603, SQLSTATE=23515, DRIVER=3.68.61

排除掉NULL值来建立索引
CREATE UNIQUE INDEX phoneidx ON emp(phone) EXCLUDE NULL KEYS;

如果不想排除NULL值那?可以增加一个列来做,但是还是有很多缺陷,对于性能有影响

drop table emp;
CREATE TABLE emp(empid INT, name VARCHAR(10), phone BIGINT,phone_help INT GENERATED ALWAYS AS (CASE WHEN phone IS NULL THEN empid ELSE NULL END));
CREATE UNIQUE INDEX phone_idx ON emp(phone, phone_help);
INSERT INTO emp(empid, name, phone) VALUES(1, 'John', 9055551234),
(2, 'Jack', 4165554321),
(3, 'Jill', NULL),
(4, 'James', 6475559876);
INSERT INTO emp(empid, name, phone) VALUES (5, 'Jeremy', NULL);
INSERT INTO emp(empid, name, phone) VALUES (6, 'Jordan', 6475559876);

在这种情况下,要在业务层面考虑,能不能给一个default值来代替null

请使用浏览器的分享功能分享到微信等