2012-01-13 24 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