2013-10-24 31 views
0

假設我有以下(樣本結構和數據):MySQL的 - 刪除相關的錶行

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 - 但我想盡可能避免重複數據。

是否可以使用上述表配置創建「級聯刪除」外鍵約束?如果不是,我應該如何更改表格才能使用?

+0

「listing_category」表上的on delete觸發器怎麼樣? – mavroprovato

回答

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 | 
+---+