Реверс НА УДАЛЕННЫЙ КАСКАД - PullRequest
4 голосов
/ 06 апреля 2011

Предположим, у меня есть следующая схема:

CREATE TABLE `users` (
  `id` int(10) unsigned auto_increment,
  `historyId` varchar(255),
  PRIMARY KEY  (`id`)
);

CREATE TABLE `histories` (
  `id` int(10) unsigned auto_increment,
  `history` TEXT,
  PRIMARY KEY  (`id`)
);

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

Какой самый простой способ сделать так, чтобы удаление пользователя также удаляло его историю?

Ответы [ 3 ]

4 голосов
/ 08 апреля 2011

Вы можете использовать триггер так:

DELIMITER $$
CREATE TRIGGER delete_user_history_on_delete_user
AFTER DELETE ON `users`
FOR EACH ROW
BEGIN
DELETE FROM `histories` WHERE id = old.historyId;
END$$
DELIMITER ;
1 голос
/ 06 апреля 2011

Я не думаю, что вы можете использовать внешний ключ для каскадного удаления здесь, потому что типы данных не совпадают. У вас есть VARCHAR (255) в одной таблице и INT (10) в другой. (Что с этим?)

Я думаю, вам придется использовать либо триггер, либо хранимую процедуру, ни одна из которых не является полностью удовлетворительной. Теоретически триггеры наиболее безопасны, так как клиентский код не может обойти их. (Код клиента может просто избежать вызова хранимой процедуры.) Но есть API, которые не активируют триггеры MySQL .

Триггеры MySQL активируются SQL только заявления. Они не активируется изменениями в таблицах API, которые не передают SQL операторы для MySQL Server

0 голосов
/ 06 апреля 2011

Если User-history это отношение 1-1, вы можете поместить ограничение в таблицу users, а не в 'hisories'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...