Внешний ключ MySQL при удалении - PullRequest
20 голосов
/ 01 декабря 2011

Я пытаюсь выяснить отношения и варианты удаления.

У меня есть две таблицы, User и UserStaff, с отношением 1: n от User до UserStaff (пользовательможет иметь несколько сотрудников).

Когда мой User удален, я хочу удалить все таблицы UserStaff, связанные с этим User.Когда мой UserStaff удален, я не хочу, чтобы что-то случилось с User.Я понимаю, что это каскадные отношения, но я не уверен, каким образом.

т.е. я выбираю существующий внешний ключ в моей таблице UserStaff и делаю его каскадным, или я создаю новый внешний ключвведите User и установите его в каскад?

Ответы [ 5 ]

20 голосов
/ 01 декабря 2011

Да, это возможно.Вы должны сделать FK в таблице UserStaff.Таким образом:

Таблица пользователей

CREATE TABLE `User` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `Name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Таблица UserStaff

CREATE TABLE `UserStaff` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `UserId` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`Id`),
  KEY `UserId` (`UserId`),
  CONSTRAINT `UserStaff_ibfk_1` 
    FOREIGN KEY (`UserId`) 
    REFERENCES `User` (`Id`) 
    ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
7 голосов
/ 01 декабря 2011

Из Википедия :

CASCADE

Каждый раз, когда строки в основной (ссылающейся) таблице удаляются (соответственно обновляются), соответствующие строки дочерней (ссылающейся) таблицы с соответствующим столбцом внешнего ключа также удаляются (соответственно обновляются). Это называется каскадным удалением (соответственно, обновление [2]).

Здесь User - главная таблица, а UserStaff - дочерняя таблица. Итак, да, вы захотите создать внешний ключ в UserStaff, с ON DELETE CASCADE

3 голосов
/ 01 декабря 2011

ON DELETE CASCADE указан для внешнего ключа в таблице UserStaff. Для получения дополнительной информации о внешних ключах документация MySQL содержит несколько примеров. Таблица User не имеет внешнего ключа, указывающего на UserStaff, поэтому изменения в таблице UserStaff не будут затронуты.

2 голосов
/ 01 декабря 2011

Самый простой способ - сделать два быстрых стола и попробовать их.Но так как вы этого не сделали, я могу сказать вам, что в результате все будет работать так, как вы хотите.

Когда у вас есть таблица User и таблица UserStaff были полем в UserStaff использует внешний ключ для ссылки на поле в User;затем, если вы удалите запись из UserStaff, которая будет удалена без какого-либо влияния на таблицу User.В противном случае будут удалены все записи, связанные с этой записью.

Короткая версия: Поле в UserStaff должно ссылаться на поле в User с CASCADE

2 голосов
/ 01 декабря 2011

Прошло много времени с тех пор, как я использовал это, но здесь идет (между прочим, я использую Toad для MySql - отличная IDE, и это тоже бесплатно - http://www.toadworld.com/Freeware/ToadforMySQLFreeware/tabid/561/Default.aspx!)

Вам необходимо добавить ограничениев таблицу пользователей. Если у вас есть столбец идентификатора (и соответствующий ключ внешнего идентификатора пользователя в UserStaff), то SouceColumn должен быть идентификатором, целевой таблицей UserStaff и целевым идентификатором столбца. Затем можно установить для действия OnDelete значение Cascade

Другие параметры довольно понятны - ограничьте значения пределов значениями в исходном столбце, Set Null устанавливает совпадения внешнего ключа равными Null, а No Action - нет, ничего.

Это очень легко сделать с помощью Toad IDE. Я давно использовал инструменты MySqlAdmin, но недавно обнаружил Toad (и у него есть инструменты сравнения и сравнения!).

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