我必须向现有表添加唯一约束。很好,除了表已经有数百万行,而且许多行违反了我需要添加的唯一约束。
删除有问题的行的最快方法是什么?我有一条SQL语句,该语句查找重复项并将其删除,但要花很长时间才能运行。有没有其他方法可以解决此问题?也许备份表,然后在添加约束后还原表?
其中一些方法似乎有些复杂,我通常这样做是:
给定table table,要在(field1,field2)上对其进行唯一化,使行保持为最大field3:
field1,field2
DELETE FROM table USING table alias WHERE table.field1 = alias.field1 AND table.field2 = alias.field2 AND table.max_field < alias.max_field
例如,我有一个表,user_accounts我想在电子邮件上添加唯一的约束,但是有一些重复项。还说我想保留最近创建的一个(重复项中的最大id)。
user_accounts
DELETE FROM user_accounts USING user_accounts ua2 WHERE user_accounts.email = ua2.email AND user_account.id < ua2.id;
注意-USING不是标准SQL,它是PostgreSQL扩展(但非常有用),但是最初的问题专门提到了PostgreSQL。
PostgreSQL