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

存在一个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 orders
WHERE orderNo IN (SELECT *
                  FROM TEMP);

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

你可能感兴趣的:(mysql)