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