MySQL 解决错误 1093

13 浏览
0 Comments

MySQL 解决错误 1093

错误1093表示,如果子查询查询的是正在删除的表,那么您不能使用子查询进行UPDATE或DELETE操作。

所以您不能这样做:

delete from table1 where id in (select something from table1 where condition) ;

好的,如何最好地绕过这个限制呢(假设您确实需要使用子查询来执行删除操作,且无法完全消除自引用的子查询)?

编辑:

对于那些感兴趣的人,这是查询:

mysql> desc adjacencies ;

+---------+---------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+---------+---------+------+-----+---------+-------+

| parent | int(11) | NO | PRI | NULL | |

| child | int(11) | NO | PRI | NULL | |

| pathLen | int(11) | NO | | NULL | |

+---------+---------+------+-----+---------+-------+

-- 查询将会

-- 告诉所有子代

-- 停止认为我的旧父母

-- 仍然是他们的父母

delete from adjacencies

where parent in

(

-- 所有我的父母,祖父母

select parent

from adjacencies

where child=@me

and parent!=@me

)

-- 只关系到我的

-- 子代的关系

and child in

(

-- 获取所有我的子代

select child

from adjacencies

where parent=@me

)

;

到目前为止,我尝试创建一个名为adjsToDelete的临时表

create temporary table adjsToRemove( parent int, child int ) ;
insert into adjsToRemove...

现在我有一组要删除的关系,其中每个父/子对都唯一地标识一行要删除的数据。但是如何从adjacencies表中删除每个呢?

看起来我需要为adjacencies中的每个条目添加一个唯一的auto_increment键,是吗?

0
0 Comments

MySQL错误1093的出现原因是子查询引用了主查询中的同一张表,这会导致MySQL无法确定要删除的行。解决方法是为子查询创建一个别名,然后在主查询中使用这个别名。具体做法是,将原先的子查询改为别名的形式,如下所示:

delete from table1 where id in 
  (select something from table1 where condition)

改为:

delete from table1 where id in
  (select p.id from (select something from table1 where condition) as p)

通过这种方式,MySQL就能正确识别要删除的行,从而避免了错误1093的问题。

0
0 Comments

MySQL中的错误1093是一个常见的错误,它通常在使用带有子查询的DELETE语句时出现。以下是出现此错误的原因和解决方法。

原因:

- 错误1093的原因是MySQL不允许在子查询中引用正在被更新的表。这是为了防止数据不一致和死锁等问题。

解决方法:

- 一种解决方法是使用INNER JOIN来替代子查询。通过将删除操作与INNER JOIN结合使用,可以避免错误1093。

- 可以使用以下语法来执行DELETE操作:

DELETE t1, t2 
FROM table1 t1  
INNER JOIN table1 t2 ON (t2.something = t1.id);

- 对于问题中的查询,可以使用以下语法来达到相同的效果:

DELETE A
FROM adjacencies A
JOIN adjacencies B ON A.parent = B.parent AND B.child = AND B.parent != 
JOIN adjacencies C ON A.child = C.child AND C.parent = ;

- 另一种解决方法是使用带有INNER JOIN的DELETE语句。以下是一个示例(未经测试):

DELETE a1 
FROM adjacencies AS a1 
INNER JOIN adjacencies AS a2 ON a1.id=a2.id 
WHERE a1.parent=a2.parent AND a2.child= AND a2.parent!=;

- 这种解决方法通过使用INNER JOIN将两个表连接起来,并在WHERE子句中指定条件来实现删除操作。

通过上述方法,可以解决MySQL中错误1093的问题。希望这篇文章对你有所帮助。

0
0 Comments

MySQL错误1093的出现原因是因为在子查询中不能同时从同一张表中删除和选择数据。

解决方法之一是在子查询中创建一个额外的列,并将匹配的ID更新到该列中,如果额外的列包含非零值,则删除该行。另一种方法是创建一个包含所有ID的快照表。作者更倾向于第二种方法,因为它不会影响当前的工作数据。

所以,解决MySQL错误1093的方法之一是在子查询中创建一个额外的列,并更新和删除满足条件的行。另一种方法是创建一个快照表来保存所有的ID,以避免影响当前的工作数据。

0