Подтвердить что ты не робот

Внешний ключ MySQL по удалению

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

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

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

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

4b9b3361

Ответ 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