【问题标题】:Problems understanding FOREIGN KEY / CASCADE constraints理解 FOREIGN KEY / CASCADE 约束的问题
【发布时间】:2012-02-09 11:56:46
【问题描述】:

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

假设我有以下表格(以及可能引用表格 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 示例的链接都非常感谢!

【问题讨论】:

  • 正确的sample code(此处为 SQL 语句)比任何即席模式和示例数据格式都更有用。样品请使用CREATE TABLEINSERT ... VALUES。所需的结果不需要以示例代码的形式呈现,因为结果是代码的输出,而不是代码本身。

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


【解决方案1】:

您似乎提出了这样的建议,这对我来说听起来很合理:

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
);

【讨论】:

    猜你喜欢
    • 2019-01-26
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    • 2023-03-22
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    相关资源
    最近更新 更多