Проблемы с пониманием ограничений FOREIGN KEY / CASCADE - PullRequest
1 голос
/ 13 января 2012

Мне нужна помощь в понимании работы внешних ключей и каскадов.Я понял теорию, но у меня возникли проблемы с применением их к примеру из реального мира.

Предположим, у меня есть следующие таблицы (и произвольное количество других таблиц, которые могут ссылаться на таблицу 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;

Итак, я создаю дополнительную таблицу, чтобы обеспечить отношение «многие ко многим» между news и tags:

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 -Таблица.
  • Если я удаляю тег, все соответствующие записи в news_tags и в каждой последующей таблице x_tags также должны быть удалены.

Боюсь, что явозможно, для этой цели, возможно, придется пересмотреть структуру моей таблицы, но это нормально, поскольку я только пытаюсь выяснить, как все это работает.

Любые ссылки на хорошие учебники, SQL-запросы или JPA-примеры приветствуются!

1 Ответ

2 голосов
/ 13 января 2012

Вы, кажется, предлагаете что-то подобное, что звучит разумно для меня:

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