引言
在设计数据库表过程中,我们通常会对数据库表进行唯一性约束,以防止事务不一致导致的相同数据的重复插入问题。但是在实际开发中发现,即使设置了数据库表的唯一性约束,仍然出现了相同数据重复插入的问题。
问题原因
例如如下的user数据库表:
id | c_user_name | i_user_age | i_user_phone |
1 | tom | 23 | |
2 | alex | 32 | 222222 |
3 | tom | 34 |
我们设置的唯一性约束如下所示:
CONSTRAINT "uc_userId" UNIQUE ("c_user_name",“i_user_phone”)
但是当第一条以及第三条i_user_phone字段数据为空时,数据库认为这是两条不同的数据。原因是字段为null时,数据库认为是不一样的数据,从而导致重复数据的插入。只有当所有的字段都不为空时,才会进行数据唯一性校验。
解决办法
create unique index userIndex on user((coalesce(i_user_phone,-1)||c_user_name))
当对应字段为空时则返回-1,这样就会避免null引起的重复数据插入问题。