在只允许1行的情况下删除最后插入的行SQL


Deleting the last inserted row SQL when only 1 row is allowed

我想知道为什么我的删除无法正常工作。

我正在尝试删除SQL行,当只接受一行带有ip地址和用户id,并且只接受一个带有ip地址的行和空白用户id时,插入的最后一个SQL行。

这是我的代码:

DELETE
FROM visitor
WHERE ip_address NOT IN
    (SELECT ip_address
     FROM visitor
     WHERE ip_address = '".$ipAddress."'
         AND user_id = ''
     ORDER BY user_id DESC LIMIT 1)

为什么我的SQL行没有被删除?

Simple:因为不允许在子查询中使用要删除的表。只需单独运行SELECT查询,然后使用结果执行DELETE。。。

RTM,它明确表示这是不允许的:

子查询中使用的表不正确:错误1093(ER_UPDATE_TABLE_USED(SQLSTATE=HY000消息="无法指定目标表'x'用于FROM子句中的更新"在以下情况下会出现此错误,即尝试修改表并从子查询中的同一表中进行选择:UPDATE t1 SET column2=(SELECT MAX(column1(FROM t1(;您可以在UPDATE语句中使用子查询进行赋值,因为子查询在UPDATE和DELETE语句以及SELECT语句中都是合法的。但是,不能将同一个表(在本例中为表t1(用于子查询FROM子句和更新目标。

特别是最后一句话很重要:但是,不能将同一个表(在本例中为表t1(用于子查询FROM子句和更新目标

有一种巧妙的方法可以解决这个问题,这很愚蠢,但上次我检查时它起了作用,那就是将您的子查询包装在另一个子查询(WHERE x IN (SELECT id FROM (SELECT id FROM tbl...))(中。但这在各个方面都很糟糕