Не понимать ошибку сервера SQL - PullRequest
0 голосов
/ 12 января 2011

У меня есть таблица пользователей (User), и мне нужно создать новую таблицу, чтобы отслеживать, какие пользователи отослали других пользователей. Итак, в основном я создаю отношение «многие ко многим» между строками в одной таблице.

Поэтому я пытаюсь создать таблицу UserReferrals со столбцами UserId и UserReferredId. Я сделал оба столбца составным первичным ключом. И оба столбца являются внешними ключами, которые ссылаются на User.UserID.

Поскольку удаление пользователя также должно удалять отношения, я установил для обоих внешних ключей каскадное удаление. Когда пользователь удаляется, любые связанные строки в UserReferrals также должны быть удалены.

Но это дает мне сообщение:

'User' table saved successfully 'UserReferrals' table Unable to create relationship 'FK_UserReferrals_User'. Introducing FOREIGN KEY constraint 'FK_UserReferrals_User' on table 'UserReferrals' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. Could not create constraint. See previous errors.

Я не получаю эту ошибку. Каскадное удаление удаляет только строку с внешним ключом, верно? Так как это может вызвать «циклические каскадные дорожки»?

Спасибо за любые советы.

Ответы [ 3 ]

1 голос
/ 12 января 2011

Если у вас есть FK в таблице (A), которая ссылается на таблицу (B), которая в свою очередь также имеет отношение к (A), или FK, которая ссылается на PK в той же таблице, это может привести к сценарию, в котором это циклы. Иногда это не представляется логически возможным, но в теории это возможно в глазах движка SQL.

Этого не избежать. Обычно мы обрабатываем их в SP (который в EF мы можем сопоставить с методом удаления).

0 голосов
/ 12 января 2011

Подумав об этом, я начинаю думать, что проблема связана не столько с циклическими каскадными путями, сколько с несколькими каскадными путями.

Хотя два идентификатора пользователя в моей таблице присоединения всегда будут разными, ничто не мешает им быть одинаковыми. Если они оба ссылались на одного и того же пользователя, и этот пользователь был удален, к присоединяющейся таблице будет несколько каскадных путей.

0 голосов
/ 12 января 2011

Если вы разрешите каскадное удаление, удаление человека, чей UserId появится в поле UserReferredId других пользователей, приведет к удалению этого пользователя! Я подозреваю, что вы хотите, чтобы значение UserReferredId было установлено равным нулю, если пользователь, связанный с ним, удален.

Существует несколько подходов: от триггера таблицы в команде удаления до использования процедуры сохранения для удаления. Игнорирование триггеров - это злой аргумент, можно создать что-то вроде:

создать триггер clearUserReferredIdOnUserDelete для пользователей после удаления как обновить пользователей установить UserReferredId = ноль, где UserReferredId в (выберите идентификатор пользователя из удаленных)

Это не проверено, но должно быть близко.

P

...