Внешний ключ MySQL по удалению
Я пытаюсь выяснить отношения и варианты удаления.
У меня есть две таблицы, User
и UserStaff
, с отношением 1: n от User
до UserStaff
(у пользователя может быть несколько сотрудников).
Когда мой User
удален, я хочу удалить все таблицы UserStaff
, связанные с этим User
. Когда мой UserStaff
удаляется, я не хочу, чтобы что-то случилось с User
. Я понимаю, что это каскадные отношения, но я не уверен, в каком направлении.
то есть. Я могу выбрать существующий внешний ключ в моей таблице UserStaff
и сделать его каскадным или создать новый внешний ключ в User
и установить его для каскадирования?
Ответы
Ответ 1
Да, это возможно. Вы должны сделать 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;
Ответ 2
Из Wikipedia:
КАСКАД
Всякий раз, когда строки в основной (ссылочной) таблице удаляются (соответственно обновлены), соответствующие строки дочерней (ссылки) таблицы с соответствующим столбцом внешнего ключа будут удалены (соответственно обновлены). Это называется каскадным удалением (соответственно обновлением [2]).
Здесь User
- основная таблица, а UserStaff
- дочерняя таблица. Итак, да, вы захотите создать внешний ключ в UserStaff
, ON DELETE CASCADE
Ответ 3
В DELTAE CASCADE указывается внешний ключ в таблице UserStaff
. Для дополнительной информации о внешних ключах документации по MySQL имеется ряд примеров. Таблица User
не имеет внешнего ключа, указывающего на UserStaff
, поэтому на него не влияют изменения в таблице UserStaff
.
Ответ 4
Прошло некоторое время с тех пор, как я использовал это, но здесь идет (кстати, я использую Toad для MySql - отличную среду IDE, и он тоже свободен - http://www.toadworld.com/Freeware/ToadforMySQLFreeware/tabid/561/Default.aspx!)
Вам нужно добавить Constraint в таблицу User. Если у вас есть столбец идентификатора (и соответствующий внешний пользовательский ключ в UserStaff), то SouceColumn должен быть id, целевой столбец UserStaff и конечный столбец userid. Затем вы можете установить действие OnDelete как "Каскад"
Другие варианты довольно понятны - ограничьте значения значений значениями в столбце источника, Set Null устанавливает соответствие внешнего ключа Null и No Action, er, ничего.
Этот материал очень легко сделать через IDE Toad. Я использовал инструменты MySqlAdmin для возрастов, но недавно обнаружил Toad (и он также имеет инструменты сравнения и сравнения!).
Ответ 5
Самый простой способ - сделать две быстрых таблицы и попробовать ее. Но так как вы этого не сделали, я могу сказать вам, что результатом будет то, что он работает так, как вы хотите.
Когда у вас есть таблица User
, а таблица UserStaff
- поле в UserStaff
, использует внешний ключ для ссылки на поле в User
; то если вы удалите запись из UserStaff
, которая будет удалена без какого-либо влияния на таблицу User
. Другой способ удалить все записи, относящиеся к этой записи.
Краткая версия: Поле в UserStaff
должно ссылаться на поле в User
с помощью CASCADE