MYSQL

MYSQL 不允许在子查询的同时删除原表数据的解决方法

作者:本站 2017-08-08 浏览:1747 标签: mysql    查询    

  对于这个错误信息:  ERROR 1093 (HY000): You can't specify target table 'clients' for update in FROM clause  或者:  

  对于这个错误信息:

  ERROR 1093 (HY000): You can't specify target table 'clients' for update in FROM clause

  或者:

  ERROR 1093 (HY000): You can't specify target table 'clients' for delete in FROM clause

  一直以来我以为只有一种办法。不过今天翻开以前的书,发现还有一个方法。

  表结构和示例数据:

  mysql> show create table branches\G

  *************************** 1. row ***************************

  Table: branches

  Create Table: CREATE TABLE `branches` (

  `bid` int(11) NOT NULL,

  `cid` int(11) NOT NULL,

  `bdesc` varchar(1000) NOT NULL,

  `bloc` char(2) NOT NULL,

  PRIMARY KEY (`bid`),

  KEY `cid` (`cid`),

  CONSTRAINT `branches_ibfk_1` FOREIGN KEY (`cid`) REFERENCES `clients` (`cid`)

  ) ENGINE=InnoDB DEFAULT CHARSET=utf8

  1 row in set (0.00 sec)

  mysql> select * from branches;

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

  | bid | cid | bdesc | bloc |

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

  | 1011 | 101 | Corporate HQ | CA |

  | 1012 | 101 | Accounting Department | NY |

  | 1013 | 101 | Customer Grievances Department | KA |

  | 1031 | 103 | N Region HO | ME |

  | 1032 | 103 | NE Region HO | CT |

  | 1033 | 103 | NW Region HO | NY |

  | 1041 | 104 | Branch Office (East) | MA |

  | 1042 | 104 | Branch Office (West) | CA |

  | 1101 | 110 | Head Office | CA |

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

  9 rows in set (0.00 sec)

  mysql> show create table clients\G

  *************************** 1. row ***************************

  Table: clients

  Create Table: CREATE TABLE `clients` (

  `cid` int(11) NOT NULL,

  `cname` varchar(64) NOT NULL,

  PRIMARY KEY (`cid`)

  ) ENGINE=InnoDB DEFAULT CHARSET=utf8

  1 row in set (0.00 sec)

  mysql> select * from clients;

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

  | cid | cname |

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

  | 101 | JV Real Estate |

  | 102 | ABC Talent Agency |

  | 103 | DMW Trading |

  | 104 | Rabbit Foods Inc |

  | 110 | Sharp Eyes Detective Agency |

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

  5 rows in set (0.00 sec)

  mysql> delete from clients where cid = (select clients.cid from clients left join branches using(cid) where bid is null);

  ERROR 1093 (HY000): You can't specify target table 'clients' for update in FROM

  clause

  解决办法

  1、利用变量赋值。

  mysql> select @m_cid:=clients.cid from clients left join branches using(cid) where bid is null;

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

  | @m_cid:=clients.cid |

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

  | 102 |

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

  1 row in set (0.00 sec)

  mysql> delete from clients where cid = 102;

  Query OK, 1 row affected (0.05 sec)

  mysql> select * from clients;

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

  | cid | cname |

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

  | 101 | JV Real Estate |

  | 103 | DMW Trading |

  | 104 | Rabbit Foods Inc |

  | 110 | Sharp Eyes Detective Agency |

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

  4 rows in set (0.00 sec)

  2、用EXISTS关键字和相关子查询:(不过这个没有之前的效率高)

  mysql> insert into clients values(102,'ABC Talent Agency');

  Query OK, 1 row affected (0.05 sec)

  mysql> delete from clients where not exists

  -> (

  -> select * from branches where branches.cid = clients.cid

  -> );

  Query OK, 1 row affected (0.06 sec)

  mysql> select * from clients;

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

  | cid | cname |

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

  | 101 | JV Real Estate |

  | 103 | DMW Trading |

  | 104 | Rabbit Foods Inc |

  | 110 | Sharp Eyes Detective Agency |

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

  4 rows in set (0.00 sec)


  • 0

  • 0

  • 1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.如有文章有版权争议,请给我们留言或者邮件告知我们,邮箱地址:028mw@126.com。