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