Могу ли я не применять ссылочную целостность в MySQL?

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

Кто-нибудь знает, как я могу изменить таблицу (через SQL или, желательно, через PHPmyAdmin, чтобы я мог это сделать?

Таблицы были созданы автоматически через Django.

Изменить: уточнить: я не хочу каскадировать удаление. То есть я хочу, чтобы строки в таблице входа в систему остались, даже если пользователь, на который они ссылаются, ушел.


person user2662692    schedule 27.02.2015    source источник
comment
dev.mysql.com/doc/refman/ 5.6 / en / create-table-foreign-keys.html, см. Раздел об удалении внешнего ключа.   -  person koriander    schedule 27.02.2015
comment
Вы используете внешний ключ и спрашиваете, почему он ведет себя как внешний ключ ... Зачем вам нужна целостность ограничений, если вас это не волнует? Просто полностью отбросьте внешний ключ.   -  person Mihai    schedule 27.02.2015
comment
@Mihai У меня создалось впечатление, что у внешних ключей есть и другие преимущества, чем просто соблюдение этого ограничения. Это правда?   -  person user2662692    schedule 27.02.2015
comment
не совсем, внешний ключ создает индекс для этого столбца, но об этом. У меня возникает вопрос, почему вам нужно сохранять логины с пользователями, которых больше не существует? Если вы хотите, чтобы история пользователей какого-то типа использовала триггер для дамп удаленных пользователей в таблице истории   -  person Mihai    schedule 27.02.2015
comment
@Mihai Мое приложение очень сильно зависит от данных. Есть сторона, где вы смотрите на диаграммы и графики, которые рассказывают вам об активности пользователей. Здесь есть графики, которые показывают входы в систему за последний месяц или год. Я бы предпочел, чтобы логины оставались на этом графике даже после удаления пользователя.   -  person user2662692    schedule 27.02.2015
comment
Итак, сколько у вас пользователей? Как вы думаете, почему вам нужно их удалить?   -  person Mihai    schedule 27.02.2015
comment
@Mihai Я бы предпочел не добавлять поле удаления в свою таблицу User. Затем каждый раз, когда я запрашиваю таблицу, мне нужно будет делать WHERE user.deleted = False   -  person user2662692    schedule 27.02.2015
comment
@Mihai на всякий случай, если пользователи больше не хотят пользоваться сайтом и хотят удалить свою учетную запись. Есть тысячи пользователей.   -  person user2662692    schedule 27.02.2015
comment
Позвольте нам продолжить это обсуждение в чате.   -  person user2662692    schedule 27.02.2015


Ответы (2)


Если вы хотите такого поведения, вы должны создать внешний ключ с предложением ON DELETE CASCADE. С внешним ключом ON DELETE CASCADE все строки, относящиеся к пользователю, будут удалены вместе с пользователем.

См. http://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html.

Изменить: если вы хотите сохранить user_id в таблицах входа в систему, вам просто нужно удалить внешний ключ. В любом случае, если вы спрашиваете, это потому, что вам, вероятно, следует выполнить логическое удаление вместо физического удаления: Сравнение физического и логического / мягкого удаления записи в базе данных?

person Jordi Llull    schedule 27.02.2015
comment
Пожалуйста, перечитайте вопрос. Я не хочу, чтобы их удаляли. Я хочу, чтобы у них было просто значение FK пользователя, которого больше не существует. Просто пользователь будет удален, но строки с FK останутся. - person user2662692; 27.02.2015
comment
Либо вам нужна ссылочная целостность, и в этом случае указанные записи должны существовать, либо вам все равно. Выбери один. У вас не может быть ссылочной целостности без согласованности базы данных. - person tadman; 27.02.2015
comment
Извини, что не понял тебя в первый раз. Я отредактировал ответ, добавив некоторую дополнительную информацию. - person Jordi Llull; 27.02.2015
comment
@JordiLlull Спасибо! Проблема в том, что у меня есть сотни запросов к таблице, и я бы предпочел не делать WHERE deleted = False в каждом запросе. - person user2662692; 27.02.2015

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

Удаление данных из главной таблицы, которая имеет ссылки ссылочной целостности на некоторые данные в подчиненной таблице, является плохой практикой.

person ivo.tisljar    schedule 21.01.2021