2012-01-13 51 views
1

我需要一些幫助來理解外鍵和級聯如何工作。我理解這個理論,但是我有麻煩把這些應用到現實世界的例子中。理解FOREIGN KEY/CASCADE約束的問題

假設我已經得到了下面的表格(及其他表的可參考表tags任意數字):

CREATE TABLE tags (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, 
    name VARCHAR(255) UNIQUE 
) Engine=InnoDB; 

CREATE TABLE news (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, 
    title VARCHAR(63), 
    content TEXT, 
    INDEX (title) 
) Engine=InnoDB; 

所以我創建了一個進一步的表提供許多一對多關係newstags之間:

CREATE TABLE news_tags (
    news_id INT UNSIGNED, 
    tags_id INT UNSIGNED, 
    FOREIGN KEY (news_id) REFERENCES news (id) ON DELETE ..., 
    FOREIGN KEY (tags_id) REFERENCES tags (id) ON DELETE ... 
) Engine=InnoDB; 

我的要求,以級聯:

  • 如果我刪除了一條消息,則應刪除news_tags中的所有對應條目。
  • 同樣適用於表x,後面可能會加上x_tags -table。
  • 如果我刪除標籤,則應該刪除news_tags以及每個其他表x_tags中的所有對應條目。

恐怕我可能不得不爲了這個目的重新訪問我的表結構,但這沒什麼問題,因爲我只是想弄清楚東西是如何工作的。

任何指向良好的教程,SQL查詢或JPA例子的鏈接表示讚賞!

+1

正確[示例代碼](http://sscce.org/)(在這裏,SQL語句)比更爲有用任何臨時模式和樣本數據格式。請使用'CREATE TABLE'和'INSERT ... VALUES'作爲樣本。所需的結果不需要作爲示例代碼呈現,因爲結果是代碼的輸出,而不是代碼本身。 – outis 2012-01-13 09:16:18

回答

2

你似乎提出這樣的事情,這聽起來合理的對我說:

CREATE TABLE tags 
(
id INTEGER NOT NULL, 
name VARCHAR(20) NOT NULL, 
UNIQUE (id), 
UNIQUE (name) 
); 

CREATE TABLE news 
(
id INTEGER NOT NULL, 
title VARCHAR(30) NOT NULL, 
content VARCHAR(200) NOT NULL, 
UNIQUE (id) 
); 

CREATE TABLE news_tags 
(
news_id INTEGER NOT NULL, 
tags_id INTEGER NOT NULL, 
UNIQUE (tags_id, news_id), 
FOREIGN KEY (news_id) 
    REFERENCES news (id) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE, 
FOREIGN KEY (tags_id) 
    REFERENCES tags (id) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE 
); 
+0

好的,那幫了我不少,謝謝。 – 2012-01-13 11:11:13