MYSQL错误代码: 1093 You can't specify target table 'sc' for update in FROM clause

MYSQL错误代码: 1093 You can't specify target table 'sc' for update in FROM clause,第1张

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最小的记录

错误如下:1045 Access denied for user 'root'@'localhost' (using password:YES)

想起来有可是在navicat添加的root@'%'用户,可能密码和现在新版本5.7的加密不同了,导致密码不对.

所以解决方法是更新用户密码.

注意5.7版本密码保存的列是 authentication_string ,密码要用函数password加密.

更新密码的SQL是 update user set authentication_string=password('密码') where user="root"

下面是Windows平台下 *** 作步骤:

配置文件my.ini ,在mysqld下面添加skip-grant-tables,意思是可以直接回车登录,保存退出。重启mySQL,然后运行cmd

输入mysql -u root -p就可以不用密码登录了,出现password:的时候直接回车可以进入。

1.切换到mysql数据库:use mysql

2.给root用户设置新密码,

mysql>update user set authentication_string=password('密码') where user="root"

3.刷新数据库mysql>flush privileges

4.再修改my.ini,把刚加入的"skip-grant-tables"这行删除或者添加#注释,保存退出再重启mysql服务就可以了。

一些参考命令

#删除之前配置 drop user 'root' @ '%'

#配置远程登录 CREATE USER 'root' @ '%' IDENTIFIED BY password( '你的密码')

#授权 GRANT ALL ON *.* TO 'root' @ '%'

#更新权限 flush privileges

#查看用户,主机,加密方法 select user,host,plugin from user

这是一项新功能,用于指定在插入或更新到一行之前检查值的条件。如果表的任何行的搜索条件的结果为 FALSE,则约束可能返回错误(但如果结果为 UNKNOWN 或 TRUE,则约束不会返回错误)。此功能开始在 MySQL 8.0.16 上运行,在以前的版本中,我们可以创建它,但它不起作用,这意味着支持语法,但不起作用。要牢记的使用规则:

AUTO_INCREMENT 自增列不允许使用

引用另一个表中的另一列不允许使用

存储的函数和用户定义的函数不允许使用

存储过程和函数参数不允许使用

子查询不允许使用

在外键中用于后续 *** 作(ON UPDATE,ON DELETE)的列不允许使用

为下一条语句 INSERT,UPDATE,REPLACE,LOAD DATA 和 LOAD XML 评估此次监测。此外,还会为 INSERT IGNORE,UPDATE IGNORE,LOAD DATA…IGNORE 和 LOAD XML…IGNORE 评估此监测约束。对于这些语句,如果约束的评估结果为 FALSE,则会发生警告。插入或更新被跳过。

我们可以使用此功能在表中添加更多的逻辑,但是根据我以前作为程序员的经验,我不建议在表中添加逻辑,因为除非您无法访问应用程序代码,否则很难找到或调试错误。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/8375914.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-15
下一篇 2023-04-15

发表评论

登录后才能评论

评论列表(0条)

保存