MySQL 解决错误 1093
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
键,是吗?
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的问题。
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的问题。希望这篇文章对你有所帮助。