更新具有重复条目的行

20 浏览
0 Comments

更新具有重复条目的行

我和这个问题中的另一个人有相同的情况,但我不想选择这些行,我想更新这些行。

我使用了Scott Saunders提供的解决方案

select * from table where email in (
    select email from table group by email having count(*) > 1
)

这个方法有效,但我想在这些条目中改变/更新一行的值,所以我尝试了以下代码:

UPDATE `members` SET `banned` = "1" WHERE `ip` IN (
    SELECT `ip` FROM `members` GROUP BY `ip` HAVING COUNT(*) > 1
)

但是我得到了以下错误:

在FROM子句中,无法为更新指定目标表'members'

0
0 Comments

这个问题的原因是不能根据members表的条件更新members表。在这种情况下,您试图根据members表的子查询来更新members表。在此过程中,您正在更改该表。这就像是一个鸡生蛋的悖论。

为了运行该更新语句,您需要创建一个临时引用表或保存/粘贴IP范围。

0
0 Comments

问题的出现原因是更新包含重复条目的行时,MySQL会报错1093。这个错误是因为在UPDATE语句中,子查询和更新的目标表是同一个表,导致MySQL无法同时读取和更新同一张表。

解决方法一是使用一个中间子查询来绕过这个错误。首先,我们创建一个子查询来获取所有有重复ip的行,然后将这个子查询作为IN子句的参数传递给UPDATE语句。

解决方法二是使用一个派生表的JOIN。首先,我们创建一个派生表来获取所有有重复ip的行,然后将这个派生表与目标表进行JOIN操作,将重复ip的行更新为禁止状态。

这两种方法都能解决MySQL报错1093的问题,使得我们能够更新包含重复条目的行。在使用中间子查询时,我们需要在UPDATE语句中嵌套两层子查询。而在使用JOIN时,我们只需要在UPDATE语句中使用一个JOIN语句和一个派生表即可。

在评论中,某些情况下了是否有其他更简洁的方法来解决这个问题。然而,大多数其他数据库不支持在UPDATE和DELETE语句中使用JOIN操作,所以JOIN选项在这里是比较干净的解决方案。

总结起来,当需要更新包含重复条目的行时,在MySQL中可能会遇到1093错误。为了解决这个问题,我们可以使用中间子查询或派生表的JOIN操作。这些方法都能绕过1093错误,使我们能够成功更新包含重复条目的行。

0