今天碰见一个问题,数据库存入了两条一模一样的数据。
因为两条数据插入间隔极小,所以开始以为是并发的问题,在排除了这个问题后,检查了数据库中该表是否设置了唯一性约束,确认有唯一性约束,理论上不应该存两条一样的数据,手动插入了一条一样的数据,还是可以插入,网上搜索了一下,果然有唯一性约束不起作用的情况,是因为Postgresql 认为null都是不相等的,多栏键值的唯一性只有全部是非NULL的情况下才可进行比较。而重复的数据正好有一个键值为NULL,解决的方式就是使用表达式索引。
举个例子说明存在表table,其中该表的唯一键为B,C,D,当成为NULL时,插入了两条一模一样的数据如下:
A | B | C | D | E |
1 | 3999111111 | NULL | 111 | 2018/08/03 |
2 | 3999111111 | NULL | 111 | 2018/08/03 |
该表中只有C可能为null,如果想让唯一性约束起作用需要这样,C字段默认空的时候存空字符串,这样就可以解决问题了。
ALTER TABLE table1
ALTER COLUMN C SET DEFAULT '';