我想知道为什么我的删除无法正常工作。
我正在尝试删除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...))
(中。但这在各个方面都很糟糕