MySQL可以执行多表删除,我的测试如下:
适用于级联删除(我以上测试是拿以前的test数据库中的两个表做的,懒得再建表了
,没啥关联,凑合用pareant_id了)。
比如删除一篇文章(表article),其评论(另外一个表comment)使用articleId做外键,当删除某篇文章时(假设id为1,同时要删除评论,实际中的id自然是靠传参),就可以用以下语句:
好文章就该列举点实际的生产使用示例(文章发布哪个网站没有?特例就算了),搞的像书本上的垃圾小例子(虽然是为了简单易懂,但每个应用点都给点提示,实际都是怎么用的嘛),会而不晓得用在哪里(想想吧,每个人都贡献下自己对某个功能的实现方式,本来一人只会一种的,现在就开阔了思路,学习了别人更好更妙的想法)。
PS:测试中条件连接先用了or(先入逻辑),结果相当错,你可以试试。
2008年12月25日 星期四 更新下内容:
使用or连接条件会把另一个表中的数据全部删除(只要两个条件有一个成立)
看这个例子,两个条件都不成立,则无数据被删除,若p.id=1成立,则Person表
删除了id为1的记录,而Tree表中的记录全被删除了。
使用and连接,我发现一旦其中一条条件不存在对应数据项,则两个表都不会删除数据。
两个都有缺点,暂无完好的解决方法。
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连接,我发现一旦其中一条条件不存在对应数据项,则两个表都不会删除数据。
两个都有缺点,暂无完好的解决方法。