Sql 使用添加的唯一约束删除列中的重复值

Sql 使用添加的唯一约束删除列中的重复值,sql,Sql,我有一个带有displayName列的表,我在其中添加了唯一约束。我正在尝试编写一个迁移,将任何非唯一的displayName设置为null,只保留用户Id较低的displayName。我的问题是: UPDATE "User" SET "displayName" = NULL WHERE id IN (SELECT id, FROM (SELECT id,

我有一个带有displayName列的表,我在其中添加了唯一约束。我正在尝试编写一个迁移,将任何非唯一的displayName设置为null,只保留用户Id较低的displayName。我的问题是:

UPDATE "User" SET "displayName" = NULL
            WHERE id IN (SELECT id,
                        FROM (SELECT id,
                                  ROW_NUMBER() OVER (partition BY "displayName" ORDER BY id) AS rnum
                              FROM "User") t
                        WHERE t.rnum > 1);
当我尝试运行迁移时,返回错误:语法错误位于或接近于


谢谢

为什么不把这写成:

UPDATE "User"
    SET "displayName" = NULL
    WHERE id > (SELECT MIN(u2.id)
                FROM "User" u2
                WHERE u2."displayName" = u."displayName"
               );

无论您使用的是什么数据库,它都应该能够利用UserdisplayName,id上的索引。

一种更简单的方法是使用CTE或子查询,类似这样的

WITH X AS 
(
SELECT id
     , [displayName] 
     , ROW_NUMBER() OVER (partition BY [displayName] ORDER BY id) AS rnum
FROM [User]
)
UPDATE X 
 SET [displayName] = NULL
WHERE rnum > 1 


另一方面,显示名称上的唯一约束实际上是:S…

用您正在使用的数据库标记您的问题。另外,示例数据和期望的结果将有助于在子查询中的id之后传递您正在使用的操作。Boss's orders。绝对不是我的主意。请注意,方括号在SQL标识符中无效。这个问题只使用sql标记,而不是特定的DBMS产品,并且这个问题还使用标准的双引号
UPDATE X
 SET [displayName] = NULL 
FROM (
        SELECT id
             , [displayName] 
             , ROW_NUMBER() OVER (partition BY [displayName] ORDER BY id) AS rnum
        FROM [User]
     ) x
WHERE rnum > 1