我們試圖以刪除重複項而不是拋出錯誤的方式向我們的postgres表中添加一個唯一約束。唯一約束跨越兩列,並且沒有主鍵。例如:在違反行的多列上添加唯一約束
i_id | term | date_created
1 | 'mako' | 123456789
1 | 'mako' | 123451234
1 | 'tele' | 213456852
2 | 'rake' | 598521542
因此,在本例中,我們需要刪除第二行,然後才能安全地添加唯一約束。通常情況下,我們將執行刪除命令,其中引入了不同的選擇,但我們沒有任何區分鍵的行。具體來說,唯一的關鍵將在列[i_id,term]之上。
(WTF沒有我們從一開始就具有唯一約束?去圖)
我想一個delete語句將是最好的,但我不能簡單地寫
delete from table where row_id not in (select row_id ... distinct something ...)
,因爲該行沒有主鍵。如果可能,我寧願避免臨時表。有什麼建議麼?
編輯:對不起。我們使用的是postgres 8.4。
編輯2:我們正在使用的解決方案是:
delete from table where ctid not in (
select
distinct on (i_id, term)
ctid
from table
order by i_id, term
);
謝謝你們!
什麼是您的PostgreSQL版本? (這幾乎總是有用的添加。) – 2012-04-03 18:30:41