我有一个包含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);
当我尝试运行迁移时,我得到的结果是" error : syntax at or near "FROM"“。
谢谢
发布于 2017-05-29 21:52:47
为什么不这样写呢:
UPDATE "User"
SET "displayName" = NULL
WHERE id > (SELECT MIN(u2.id)
FROM "User" u2
WHERE u2."displayName" = u."displayName"
);
无论您使用的是什么数据库,这也应该能够利用"User"("displayName", id)
上的索引。
发布于 2017-05-29 21:54:13
一种更简单的方法是使用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
或
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
顺便说一句,显示名称的唯一约束实际上是:S ...
https://stackoverflow.com/questions/44250695
复制相似问题