從大型 SQL 表中有效刪除重複行
為大型表(數百萬行)新增唯一約束需要仔細處理重複條目。 使用標準 SQL 查詢直接刪除重複項可能會非常緩慢且佔用資源。
一種簡單的方法包括備份表,新增唯一約束,然後從備份還原表。這可確保僅保留唯一的行。
然而,更精細的方法使用簡潔的 SQL 查詢來優化刪除過程:
<code class="language-sql">DELETE FROM table USING table AS alias WHERE table.field1 = alias.field1 AND table.field2 = alias.field2 AND table.max_field < alias.max_field;</code>
此查詢透過比較基於 field1
和 field2
的行來有效地刪除重複項。 它保留具有最高 max_field
值的行,有效地消除了較低值的重複項。 例如:
<code class="language-sql">DELETE FROM user_accounts USING user_accounts AS ua2 WHERE user_accounts.email = ua2.email AND user_accounts.id < ua2.id;</code>
此範例刪除重複的電子郵件地址,保留具有最高 id
的帳戶(可能是最近建立的)。
重要提示: USING
子句是 PostgreSQL 特有的功能,它透過啟用直接行比較來顯著提高查詢效率。 其他資料庫系統可能需要替代方法。
以上是如何有效地從大型 SQL 表中刪除重複行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!