MySQL - 删除相关的表行

时间:2013-10-24 15:51:58

标签: mysql sql

假设我有以下内容(样本结构和数据):

Table category
======================

id (PK)  name
-----------------
45       computers
50       sports


Table category_tag
======================

id (PK)  name         cat_id (FK)
---------------------------------
100      keyboard     45
120      football     50


Table listing_category
======================

list_id (PK)    cat_id (PK/FK)
------------------------------
10001           45
10001           50


Table listing_tag
======================

list_id (PK)    cat_tag_id (PK/FK)
----------------------------------
10001           100
10001           120

在上面的示例中,需要发生的是,当删除listing_category表中的行时,还需要删除表listing_tag中的相关条目。

现在我知道我可以将表'category'和表'category_tag'结合起来,但我更喜欢将它们分开,因为category_tag表包含额外的字段和数据。

另一个选项是向表cat_id添加listing_tag列 - 但我希望尽可能避免重复数据。

是否可以使用上面的表配置创建“级联删除”外键约束?如果没有,我应该如何更改表格才能生效?

1 个答案:

答案 0 :(得分:1)

SELECT * FROM ints;
+---+
| i |
+---+
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
+---+

SELECT * FROM my_a;
+----+--------+--------+
| id | value1 | value2 |
+----+--------+--------+
|  0 |   1.00 |   2.20 |
|  1 |   2.10 |   3.50 |
|  2 |   5.20 |   2.90 |
+----+--------+--------+

DELETE x
     , y 
  FROM ints x 
  JOIN my_a y 
    ON y.id = x.i 
 WHERE y.value1 = 1.00 
    AND y.value2 = 2.2;

SELECT * FROM my_a;
+----+--------+--------+
| id | value1 | value2 |
+----+--------+--------+
|  1 |   2.10 |   3.50 |
|  2 |   5.20 |   2.90 |
+----+--------+--------+

SELECT * FROM ints;
+---+
| i |
+---+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
+---+