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