1. 程式人生 > >postgresql資料庫唯一性約束沒起作用

postgresql資料庫唯一性約束沒起作用

    今天碰見一個問題,資料庫存入了兩條一模一樣的資料。

    因為兩條資料插入間隔極小,所以開始以為是併發的問題,在排除了這個問題後,檢查了資料庫中該表是否設定了唯一性約束,確認有唯一性約束,理論上不應該存兩條一樣的資料,手動插入了一條一樣的資料,還是可以插入,網上搜索了一下,果然有唯一性約束不起作用的情況,是因為Postgresql 認為null都是不相等的,多欄鍵值的唯一性只有全部是非NULL的情況下才可進行比較。而重複的資料正好有一個鍵值為NULL,解決的方式就是使用表示式索引。

    舉個例子說明存在表table,其中該表的唯一鍵為B,C,D,當成為NULL時,插入了兩條一模一樣的資料如下:

table1
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 '';