只要在本库下运行sql语句就可以,你试下下面的语句
创建一个EMPLOYEE的表
CREATE TABLE `EMPLOYEE `
(`Fname` VARCHAR(15) NOT NULL,
`Minit` CHAR,
`Lname` VARCHAR(15) NOT NULL,
`Ssn` CHAR(9) NOT NULL,
`Bdate` DATE,
`Address` VARCHAR(30),
`Sex` CHAR,
`Salay` DECIMAL(10,2),
`Super_ssn` CHAR(9),
`Dno` INT NOT NULL,
PRIMARY KEY(Ssn),
FOREIGN KEY(Super_ssn) REFERENCES EMPLOYEE(Ssn),
FOREIGN KEY(Dno) REFERENCES DEPARTMENT(Dnumber)
)
MYSQL执行如下语句报错:
报错信息如下:
意思是不能在同一语句中更新select出的同一张表元组的属性值
解决方法:将select出的结果通过中间表再select一遍即可。
MYSQL手册restrictions.html#subquery-restrictions里给出了限制规则和解决方法:
其实想想也是这样的,对同一张表查的同时更新会引起数据不一致的问题吧,但是将查询结果事先放到临时表中就不会有这个问题了。
这个是我们在使用update或者delete语句时,在where条件里面加入的子查询导致的。例如如下的update语句:
修改上述语句为下面这样,该问题可以解决:
注意,这样一定要给最里面的子查询定义一个别名,不然会报另外一个错误:
自己的例子:下面这种方式报错 error code:1093
所以改成:
原因:一定要给最里面的子查询定义一个别名.
中文意思:不能先select出同一表中的某些值,再update这个表(在同一语句中)
解决: 注:把同一个table重新包一遍,重命名
原句
修改后
转自 http://www.cnblogs.com/lteal/archive/2013/05/06/3062709.html
*** 作没有问题,按照本思路对product表进行 *** 作
产生You can't specify target table '表名' for update in FROM clause错误
3、解决思路:既然Mysql不让对查询到的目标语句进行更新,那么我在它的上面在套一个子查询就可以。
将SELECT出的结果再通过中间表SELECT一遍,这样就规避了错误。需要注意的是,这个问题只出现于MySQL,MSSQL和Oracle不会出现此问题。
如下业务场景,ecs_order_shipping表里面记录了每一个订单的配送流转记录,type从11,12,21,22,23这么递进.
按理说每个订单的每一个type就出现一次,因为系统bug造成type为11、12的记录,都出现了两次或多次。对于每一个订单,如果它有两条type等于11的ecs_order_shipping记录,那么只保留第一条,其他的删除。
一、先查出来那些要被删除的记录的id组合
#查出type为11的全部记录
#分组后,记录少了,说明有重复的记录
#这样筛选出那些重复的订单
#从筛选的重复订单中,得到id最大的
二、根据这些id组合,删除他们
这样就会报错!!!Error : You can't specify target table 'ecs_order_shipping' for update in FROM clause
三、如上,修改sql语句如下即可
/****每个订单type等于11,12的记录,出现了很多重复的,要删除重复项,只留下最早的那个***/
改为下面就OK
删除重复,但保留最小id项。
删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)