Как мне запросить внешние ключи, которые не соответствуют их ограничениям?
-
06-07-2019 - |
Вопрос
SQL Server 2005.
Я добавляю ограничения внешнего ключа в базу данных приложения, которое якобы в них не нуждалось.Естественно, данные стали ненадежными, и в поле внешнего ключа появились потерянные записи.
Настройка:
Две таблицы, TableUser и TableOrder.TableUser имеет первичный ключ 'userId', а TableOrder имеет внешний ключ 'userId'.
Как мне найти строки, в которых TableOrder.Идентификатор пользователя не имеет соответствующей записи в TableUser.Идентификатор пользователя?
Например, TableOrder.Идентификатор пользователя имеет значение 250, но нет соответствующего TableUser.Ключ идентификатора пользователя для 250.
Решение
Вот один из способов:
select * from TableOrder where UserID not in (select UserID from TableUser);
Существует много различных способов написания такого рода запросов.
Другие советы
Другой распространенный подход - это левое внешнее соединение:
SELECT * FROM TableOrder o
LEFT OUTER JOIN TableUser u ON o.UserID = u.UserID
WHERE u.UserID is NULL
Этот запрос также может быть полезен без предложения where, чтобы просмотреть соответствующие значения (если они существуют) и определить, какие из них не совпадают.
Начнем с того, что в таблицах не было никаких ограничений FK.Они использовались как FK и PK, но не кодировались - считалось, что они были ненужными накладными расходами.Итак, у нас есть все столбцы, но нет закодированных ограничений.Когда я пошел, чтобы ввести их в действие, я обнаружил, что было много нарушений.
Ваш вопрос высвечивает проблему.Они не являются ненужными накладными расходами, они предохраняют людей от общего захламления базы данных.
Ответы Грега и Брэда помогли мне в этом.