SQL: удалить записи с недействительными внешними ключами - PullRequest
3 голосов
/ 31 октября 2009

Я только что нашел ошибку в своем приложении на Rails, которая приводила к тому, что некоторые записи не удалялись вместе со связанными объектами. Ошибка была исправлена, но теперь в моей базе данных есть несколько тысяч записей со значениями внешнего ключа, указывающими на несуществующие записи.

Можно ли удалить все записи в таблице, где целочисленный внешний ключ ссылается на запись в другой таблице, которая не существует в SQL? Как?

Ответы [ 6 ]

15 голосов
/ 31 октября 2009
delete from child_table where not exists 
   (select 1 from parent_table where parent_table.id=child_table.related_id)

следующим шагом, конечно же, является немедленное создание ограничения FOREIGN KEY (если только вы не используете MySQL MySQL, в этом случае вам не повезло).

6 голосов
/ 31 октября 2009
DELETE FROM tblPerson
WHERE DepartmentID NOT IN (SELECT ID FROM tblDepartment)
2 голосов
/ 23 ноября 2015

Да, есть несколько способов удалить все старые строки. Допустим, у вас есть таблица с именем users со столбцом id и таблица с именем posts со столбцом user_id, которая должна ссылаться на существующего пользователя. Вы можете удалить все сообщения несуществующих пользователей с помощью этого запроса:

DELETE FROM posts WHERE user_id NOT IN (SELECT id FROM users);

Это сообщение было опубликовано Дамиром Сударевичем ранее. Это проще и быстрее, чем ответ zzzeek .

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

1 голос
/ 31 октября 2009

Удалить из ChildTable, где ForeignKeyField отсутствует (выберите PrimaryKeyField из ParentTable)

0 голосов
/ 31 октября 2009

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

class Post 
 belongs_to :user
end

Здесь вы можете использовать такой скрипт

 Post.all.each do |post|
   post.delete if post.user.nil?
 end

Это проще и проще, чем писать SQL. Но на этот раз сделайте дамп БД, прежде чем пытаться творить чудеса

0 голосов
/ 31 октября 2009

да - использовать сложный оператор, используя "ГДЕ col нет (идентификатор выбора из FKTABLE)"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...