论坛首页 综合技术论坛

MySQL执行多表删除

浏览 3590 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-12-19   最后修改:2008-12-25
MySQL可以执行多表删除,我的测试如下:



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连接,我发现一旦其中一条条件不存在对应数据项,则两个表都不会删除数据。

两个都有缺点,暂无完好的解决方法。
   发表时间:2009-03-19  
还是自带的级联删除好啊。。
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics