码迷,mamicode.com
首页 > 数据库 > 详细

MySQL问题:You can't specify target table '表名' for update in FROM clause

时间:2016-07-10 09:56:33      阅读:293      评论:0      收藏:0      [点我收藏+]

标签:mysql


在MySQL中,写SQL语句的时候 ,可能会遇到You can‘t specify target table ‘表名‘ for update in FROM clause这样的错误,它的意思是说,不能先select出同一表中的某些值,再update这个表(在同一语句中)。


1、问题是如何出现的?


数据准备

CREATE TABLE T_Person(
	pId INT PRIMARY KEY AUTO_INCREMENT,
	pName VARCHAR(20)
);

INSERT INTO T_Person(pName) VALUES(‘陈一‘);
INSERT INTO T_Person(pName) VALUES(‘黄二‘);
INSERT INTO T_Person(pName) VALUES(‘张三‘);
INSERT INTO T_Person(pName) VALUES(‘张三‘);
INSERT INTO T_Person(pName) VALUES(‘李四‘);
INSERT INTO T_Person(pName) VALUES(‘李四‘);
INSERT INTO T_Person(pName) VALUES(‘王五‘);
INSERT INTO T_Person(pName) VALUES(‘赵六‘);
INSERT INTO T_Person(pName) VALUES(‘赵六‘);
INSERT INTO T_Person(pName) VALUES(‘钱七‘);
INSERT INTO T_Person(pName) VALUES(‘王五‘);
INSERT INTO T_Person(pName) VALUES(‘李四‘);
INSERT INTO T_Person(pName) VALUES(‘孙八‘);
INSERT INTO T_Person(pName) VALUES(‘杨九‘);
INSERT INTO T_Person(pName) VALUES(‘张三‘);
INSERT INTO T_Person(pName) VALUES(‘吴十‘);

SELECT * FROM T_Person;


数据如下:

技术分享


通过看表中的数据,我们可以知道里面包含重复的数据:如“张三”、“李四”等。


那究竟有哪些名字出现重复了呢?

SELECT pName FROM T_Person GROUP BY pName HAVING COUNT(pName)>1;

技术分享

接下来,我们把凡是有重复名字的记录全部删除

DELETE FROM T_Person
WHERE pName IN (SELECT pName 
		FROM T_Person 
		GROUP BY pName HAVING COUNT(pName)>1);

这时候,我们会遇到一个错误:

错误码: 1093
You can‘t specify target table ‘T_Person‘ for update in FROM clause


2、问题如何解决

将SELECT出的结果再通过中间表SELECT一遍,这样就规避了错误。

例如:

DELETE FROM T_Person
WHERE pName IN (SELECT pName 
		FROM (SELECT pName 
		      FROM T_Person 
		      GROUP BY pName HAVING COUNT(pName)>1
		) AS temp);

再用查看数据

SELECT * FROM T_Person;

结果如下:

技术分享


注意,这个问题只出现于MySQL,MSSQL和Oracle不会出现此问题。








MySQL问题:You can't specify target table '表名' for update in FROM clause

标签:mysql

原文地址:http://lsieun.blog.51cto.com/9210464/1813900

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!