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

MySql Внешние ключи: ON DELETE NO ACTION behavour - как оставить информацию в ссылочной области?

У меня есть две таблицы, один "пользователь" и один "заказы", ​​где в таблице заказов есть ссылка внешнего ключа на таблицу идентификаторов пользователя. (В этом случае я использую адрес электронной почты как идентификатор пользователя.)

Я хочу выполнить следующее:

  • Если обновлен идентификатор таблицы пользователя (= адрес электронной почты изменен), это будет отображаться в поле user_id таблицы привязанных заказов. (Это отлично работает, используя директиву ON UPDATE CASCADE - здесь нет проблем!)

  • Если пользователь удален из таблицы пользователя, порядок останется, СОХРАНЯЙТЕ указанный user_id.

У меня проблема со второй целью:

Если я использую ON DELETE CASCADE в указанном поле идентификатора пользователя, строка заказа, конечно, удаляется.

Если я использую ON DELETE NO ACTION, я получаю сообщение об ошибке при попытке удалить пользователя. (# 1451 - Не удается удалить или обновить родительскую строку: сбой внешнего ключа)

Если я использую ON DELETE SET NULL, я могу удалить строку пользователя, но для указанной информации установлено значение null, поэтому я не могу отследить, кто сделал этот заказ...

Есть ли способ разрешить удаление пользователя из таблицы пользователя, сохраняя указанную информацию user_id в таблице заказов?

4b9b3361

Ответ 1

Два варианта:

  • На самом деле не удаляйте пользователя, просто отметьте их как удаленные, установив поле deleted.

или

  • Удалить ограничение внешнего ключа.

Я бы порекомендовал первый вариант. Второй вариант может привести к несогласованности данных. Кроме того, просто наличие значения ключа без соответствующих данных в другой таблице вам все равно не поможет.

Ответ 2

На самом деле существует еще одна альтернатива - замените ключ электронной почты в таблице пользовательских таблиц автоинкрементами INT.

Затем вы можете просто скопировать пользовательский атрибут (ugh, denormalized) в заказ (я думаю, вы могли бы оправдать его как "адрес электронной почты пользователя заказа во время заказа" ).

Затем ON DELETE SET NULL может reset использовать внешний ключ INT, но не скопированный атрибут (адрес электронной почты).