数据库删除重复属性列,错误[HY000][1093] You can't specify target table 'orders' for update in FROM clause

来源:互联网 发布:windows java进程监控 编辑:程序博客网 时间:2024/06/05 17:05

存在一个orders表:

CREATE TABLE `orders` (  `Id_o` int(11) NOT NULL AUTO_INCREMENT, `orderNo` VARCHAR(20) NOT NULL,  `Id_p` int(11) DEFAULT NULL,  PRIMARY KEY (`Id_O`)) ENGINE=InnoDB DEFAULT CHARSET=utf8

因为存在orderNo重复的行,所以将其删除去。

首先查询出表中orderNo属性重复的orderNo:

SELECT  * FROM  orders GROUP BY  OrderNo HAVING count(OrderNo) >1;

然后利用DELETE 删除:

DELETE  FROM  orders WHERE orderNo in (SELECT  orderNo FROM  orders GROUP BY  OrderNo HAVING count(OrderNo) >1)

但是IDEA提示报错:

[HY000][1093] You can't specify target table 'orders' for update in FROM clause

检查了半天,语法一点都没错误。
最后网上查找,发现是因为不能select了一个属性列,然后同时UPDATE更新这个属性列所在的表,
这是在MySql才会存在的。

解决方法

用另外一个表,存储SELECT出来重复的orderNo属性列。
但是每次检查删除重复属性的时候,都创建一个表,或者用了之后要DROP,会影响效率,内存等等。

所以可以采用临时表。

当工作在非常大的表上时,你可能偶尔需要运行很多查询获得一个大量数据的小的子集,不是对整个表运行这些查询,而是让MySQL每次找出所需的少数记录,将记录选择到一个临时表可能更快些,然后多这些表运行查询。

创建临时表就是在CREATE 语句加上一个TEMPORARY .

接着上面的问题。

创建一个临时表temp用来保存语句:
SELECT orderNo
FROM orders
GROUP BY OrderNo
HAVING count(OrderNo) > 1; 的查询表结果。

CREATE TEMPORARY TABLE `TEMP` SELECT orderNo                              FROM orders                              GROUP BY OrderNo                              HAVING count(OrderNo) > 1;

这样删除的时候,就可以用上这个temp表,里面保存了orderNo重复属性字段。

DELETE FROM ordersWHERE orderNo IN (SELECT *                  FROM TEMP);

这样就可以删除掉表里存在指定重复属性的元祖。当然,临时表会在connection/session断开的时候释放。

阅读全文
1 0
原创粉丝点击