无法在同一张表上查询和更新的问题解决方法

一、问题引入

要在一张已存在并且有数据的表上建一个唯一索引,由于建索引的这列有很多重复的数据,导致无法建unique索引!要一条条数据手工删除吗?不!我是工程师,我要用技术的手段删除重复数据。写了一个删除重复数据的sql,如下:

    delete
    from entity_tag
    where id not in (select max(id)
                from entity_tag
                group by code )

写完了,十分兴奋的跑一下这个sql,结果大跌眼镜

[语句1]: 
delete from entity_tag where id not in (select max(id) from entity_tag group by code ) 
失败, 详情: You can’t specify target table ‘entity_tag’ for update in FROM clause

有些崩溃,语法上完全没有错误!可惜在MySQL的世界里,对同一张表的更新和查询是不能同时执行的,这也就有了对应的MySQL执行错误提示。

二、解决办法

拿着这个问题请教我师兄,师兄教了我一个小trick。在子查询的外面再封装一个select查询,改下表名。问题迎刃而解!

delete
from entity_tag
where id not in (select id from
                 (  select max(id)
                    from entity_tag
                    group by code ) tmp_table)

有了张临时表t,这样便避免了在同一个表上更新和查询。

时间: 2024-12-28 05:43:03

无法在同一张表上查询和更新的问题解决方法的相关文章

同一张表,查询某人最新一条记录

这是一张表的数据记录,现在想查询每个stuname最新的一条全部记录,也就是王鹏.王山.王丽最新的一条记录,查出来的结果在一张表上. 解法: select * from table as a where exists(select 1 from table group by stuname having max(stuid)=a.stuid)Access2007(Access2000兼容模式)执行通过.

Yii的Relational Active Record三张表连接查询

需求如下: 查询book表信息,同时关联entitystags表,以entitystags的字段eid关联book的主键,再关联查询tags表,以entitystags表的tid字段关联tags表的主键id 同时读出这三张表的信息来,在Yii可以如下处理,先在relations方法中声明三张表的关系,在控制器中,以with表明渴求式调用,即可,代码如下: 在book的model文件中声明关系: public function relations(){ return array( 'entitys

从远程oracle上导入到本地同一张表中不存在的记录的方法

场景:在远程oracle上存在一张表A,在本地同样存在一张相同表结构的表B.由于本地表B中保存了业务系统操作产生的几条记录,同时原来导入了A中的部分记录,但是并没有保存A中全部的记录.A中有15条记录,B中保存了A中3条记录同时B中还有本地业务系统产生的4条记录,不能删除B中的业务系统产生的4条记录.现在想将A中的另外的12条记录导入B中,同时有能保留B中原来的由业务系统产生的4条记录. 解决sql: 1.先在A中获得在B中出现过的记录. select * from [email protect

Dynamic CRM 2013学习笔记(九)CrmFetchKit.js介绍:Fetchxml、多表联合查询, 批量更新

CrmFetchKit.js是一个跨浏览器的一个类库,允许通过JavaScript来执行fetch xml的查询,还可以实现批量更新,分页查询等.目前已支持Chrome 25, Firefox 19 和 IE9/10 . 它的最大优势是可以通过fetchxml 来查询,这样我们就可以实现真正的多表联合查询,虽然可以用OData终结点的$expand来进行多表的联合查询,但这种方式没办法过滤多表的条件,它只能过滤主表的条件. 下面来看下简单的多表查询的例子: 1.首先定义一个fetchxml: 1

175. Combine Two Tables【LeetCode】-LEFT JON 和RIGHT JOIN,两张表关联查询-java -sql入门

Table: Person +-------------+---------+ | Column Name | Type | +-------------+---------+ | PersonId | int | | FirstName | varchar | | LastName | varchar | +-------------+---------+ PersonId is the primary key column for this table. Table: Address +--

两张表联合查询,其中一张表对应多行。将多行的数据合并为一行,并用,隔开

直接上代码 1 SELECT DISTINCT [A].[BizID] 2 ,STUFF((SELECT ','+ ActivityModelStepName + ':'+ UserName FROM [dbo].BizBaseStep WHERE BizID = A.BizID 3 FOR XML PATH('') 4 ) ,1,1,'' )AS auditor 5 FROM [dbo].[BizBase] AS A 查询结果如下: for xml path('') 作用是将查询结果组成一个x

Oracle数据库中,知道一张表,查询与其有主外键关系的表

--查外键表NC56.CSCI有无对应的主键表 SELECT a.owner, A.TABLE_NAME primary_table_name, A.CONSTRAINT_NAME primary_table_key_name, b.owner, B.TABLE_NAME foreign_table_name, B.CONSTRAINT_NAME foreign_table_foreign_key_name, B.STATUS foreign_table_foreign_key_stat FRO

Oracle在表上建立自增字段的方法

本方法为使用SEQUENCE(序列) 例如有表temp_test结构为: create table TEMP_TEST ( id number, nm varchar(10), primary key(id)   //id为主键,下面的方法把它设为自增字段) 1.建立自增序列TEMP_TEST_IDADD,命名任意,从1开始,每次加1 CREATE SEQUENCE TEMP_TEST_IDADD INCREMENT BY 1 START WITH 1; 2.在表temp_test上建立触发器如

怎么给一张表添加外键(四种方法)

添加外键约束名字一定不能重复如何添加外键方法一:直接在属性值后面添加 create table score( cscore int(11), st_id int(50) references student(id), cs_id int(30) references classes(id), primary key(st_id,cs_id) ); 方法二: create table score( cscore int(11), st_id int(50), cs_id int(30), prim