今天碰見一個問題,數據庫存入了兩條一模一樣的數據。
因爲兩條數據插入間隔極小,所以開始以爲是併發的問題,在排除了這個問題後,檢查了數據庫中該表是否設置了唯一性約束,確認有唯一性約束,理論上不應該存兩條一樣的數據,手動插入了一條一樣的數據,還是可以插入,網上搜索了一下,果然有唯一性約束不起作用的情況,是因爲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 '';