Внешний Ключ 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 с каскадом