浏览 3609 次
锁定老帖子 主题:MySQL执行多表删除
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-12-19
最后修改:2008-12-25
mysql> select * from person; +----+------+-----------+----------+----------+ | id | age | firstname | lastname | image_id | +----+------+-----------+----------+----------+ | 2 | NULL | NULL | NULL | NULL | | 21 | NULL | NULL | NULL | NULL | | 1 | NULL | NULL | NULL | NULL | +----+------+-----------+----------+----------+ 3 rows in set (0.00 sec) mysql> select * from tree; +----+------+-----------+ | id | name | parent_id | +----+------+-----------+ | 1 | name | 1 | | 2 | name | 1 | | 3 | name | 1 | | 4 | name | 2 | | 5 | name | 2 | | 6 | name | 2 | +----+------+-----------+ 6 rows in set (0.00 sec) mysql> delete p,t from person p,tree t where p.id = 1 and t.parent_id =1; Query OK, 4 rows affected (0.02 sec) /* 执行之后看结果 */ mysql> select * from person; +----+------+-----------+----------+----------+ | id | age | firstname | lastname | image_id | +----+------+-----------+----------+----------+ | 2 | NULL | NULL | NULL | NULL | | 21 | NULL | NULL | NULL | NULL | +----+------+-----------+----------+----------+ 2 rows in set (0.00 sec) mysql> select * from tree; +----+------+-----------+ | id | name | parent_id | +----+------+-----------+ | 4 | name | 2 | | 5 | name | 2 | | 6 | name | 2 | +----+------+-----------+ 3 rows in set (0.01 sec) mysql> 适用于级联删除(我以上测试是拿以前的test数据库中的两个表做的,懒得再建表了 ,没啥关联,凑合用pareant_id了)。 比如删除一篇文章(表article),其评论(另外一个表comment)使用articleId做外键,当删除某篇文章时(假设id为1,同时要删除评论,实际中的id自然是靠传参),就可以用以下语句: delete a,c from article a,comment c where a.id = 1 and c.articleId = 1; 好文章就该列举点实际的生产使用示例(文章发布哪个网站没有?特例就算了),搞的像书本上的垃圾小例子(虽然是为了简单易懂,但每个应用点都给点提示,实际都是怎么用的嘛),会而不晓得用在哪里(想想吧,每个人都贡献下自己对某个功能的实现方式,本来一人只会一种的,现在就开阔了思路,学习了别人更好更妙的想法)。 PS:测试中条件连接先用了or(先入逻辑),结果相当错,你可以试试。 2008年12月25日 星期四 更新下内容: 使用or连接条件会把另一个表中的数据全部删除(只要两个条件有一个成立) mysql> select * from tree; +----+--------+-----------+-------+ | id | name | parent_id | value | +----+--------+-----------+-------+ | 1 | name | 2 | value | | 2 | nam2e | 2 | value | | 3 | nam32e | 2 | value | +----+--------+-----------+-------+ 3 rows in set (0.00 sec) mysql> select * from person; +----+------+-----------+----------+----------+ | id | age | firstname | lastname | image_id | +----+------+-----------+----------+----------+ | 3 | NULL | NULL | NULL | NULL | | 1 | NULL | NULL | NULL | NULL | | 2 | NULL | NULL | NULL | NULL | +----+------+-----------+----------+----------+ 3 rows in set (0.00 sec) mysql> delete p,t from person p,tree t where p.id=4 or t.parent_id =3; Query OK, 0 rows affected (0.00 sec) mysql> delete p,t from person p,tree t where p.id=1 or t.parent_id =3; Query OK, 4 rows affected (0.02 sec) mysql> 看这个例子,两个条件都不成立,则无数据被删除,若p.id=1成立,则Person表 删除了id为1的记录,而Tree表中的记录全被删除了。 使用and连接,我发现一旦其中一条条件不存在对应数据项,则两个表都不会删除数据。 两个都有缺点,暂无完好的解决方法。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-03-19
还是自带的级联删除好啊。。
|
|
返回顶楼 | |