永发信息网

MySQL删除时使用子句报错

答案:3  悬赏:0  手机版
解决时间 2021-04-06 15:51
  • 提问者网友:暗中人
  • 2021-04-06 10:19
前提:表中的ID是自增的,总共三个字段。
删除语句:delete from tab_test where tab_id in (select max(tab_id) from tab_test group by tab_name);
执行时报错:Lookup Error - MySQL Database Error: You can't specify target table 'tab_test' for update in FROM clause
最佳答案
  • 五星知识达人网友:低血压的长颈鹿
  • 2020-01-30 12:29
删除时的条件不能是同一个表的查询结果.因为删除的同时这个表的查询结果也会根着变.你可以想办法把select改成写到where里面去.
你是想把同一个tab_name的相同的记录的最后一条结果删除?
create table temp_table_id select max(tab_id) as tab_id from tab_test group by tab_name;

delete from tab_test where tab_id in (select tab_id from temp_table_id);
这种效率最高.
全部回答
  • 1楼网友:鸠书
  • 2020-10-05 09:08
在我们使用mysql数据库时,比较常用也是查询,包括基本查询,关联查询,条件查询等等,对于同一个操作,sql语句的实现有很多种写法,但是不同的写法查询的性能可能会有很大的差异。这里主要介绍下select查询优化的要点。 1. 使用慢查询日志去发现慢查询。 2. 使用执行计划去判断查询是否正常运行。 3. 总是去测试你的查询看看是否他们运行在最佳状态下 –久而久之性能总会变化。 4. 避免在整个表上使用count(*),它可能锁住整张表。 5. 使查询保持一致以便后续相似的查询可以使用查询缓存。 6. 在适当的情形下使用group by而不是distinct。 7. 在where, group by和order by子句中使用有索引的列。 8. 保持索引简单,不在多个索引中包含同一个列。 9. 有时候mysql会使用错误的索引,对于这种情况使用use index。 10. 检查使用sql_mode=strict的问题。 11.对于记录数小于5的索引字段,在union的时候使用limit不是是用or. 12. 为了 避免在更新前select,使用insert on duplicate key或者insert ignore ,不要用update去实现。 3. 不要使用 max,使用索引字段和order by子句。 14. 避免使用order by rand(). 15. limit m,n实际上可以减缓查询在某些情况下,有节制地使用。 16. 在where子句中使用union代替子查询。 17. 对于updates(更新),使用 share mode(共享模式),以防止独占锁。 18. 在重新启动的mysql,记得来温暖你的数据库,以确保您的数据在内存和查询速度快。 19. 使用drop table,create table delete from从表中删除所有数据。 20. 最小化的数据在查询你需要的数据,使用*消耗大量的时间。 21. 考虑持久连接,而不是多个连接,以减少开销。 22. 基准查询,包括使用服务器上的负载,有时一个简单的查询可以影响其他查询。 23. 当负载增加您的服务器上,使用show processlist查看慢的和有问题的查询。 24. 在开发环境中产生的镜像数据中 测试的所有可疑的查询。 来源:php程序员雷雪松的博客
  • 2楼网友:逐風
  • 2020-10-17 23:32
出现1064一般都属于语法错误的情况。你试着把表名的单引号和把tinyint的长度去掉。DATE值的格式是'YYYY-MM-DD'。按照标准的SQL,不允许其他格式。日期支持的范围为’1000-01-01’到’9999-12-31’。但从表面上看,你写的这个SQL语句不存在错误,你仔细检查有没有多写了一个符号之类的。还要检查语句与语句间有没有空格。例如你这么写就是错误的:ENGINE=InnoDBDEFAULTCHARSET=gbkAUTO_INCREMENT=1;CREATETABLEmessage(idtinyintnotnullauto_increment,uservarchar(25)notnull,titlevarchar(50)notnull,contenttinytextnotnull,lastdatedatenotnulldefault'0000-00-00',primarykey(id))ENGINE=InnoDBDEFAULTCHARSET=gbkAUTO_INCREMENT=1;希望能帮助到你,欢迎追问,尽我所能为你解答。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯