理解FOREIGN KEY / CASCADE约束的问题

时间:2012-01-13 08:42:33

标签: sql jpa foreign-keys constraints cascading-deletes

我需要一些帮助来理解外键和级联如何工作。我理解这个理论,但是我把这些理论应用到一个现实世界的例子中会遇到麻烦。

假设我有以下表(以及可能引用表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 - table的表x_tags
  • 如果我删除了一个代码,那么news_tags和其他每个代码x_tags中的所有相应条目也应该被删除。

我担心为了这个目的我可能不得不重新访问我的表格结构,但这没关系,因为我只想弄清楚它是如何起作用的。

任何指向优秀教程,SQL查询或JPA示例的链接都表示赞赏!

1 个答案:

答案 0 :(得分: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
);