Как мне запросить внешние ключи, которые не соответствуют их ограничениям?

StackOverflow https://stackoverflow.com/questions/259486

Вопрос

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, но не кодировались - считалось, что они были ненужными накладными расходами.Итак, у нас есть все столбцы, но нет закодированных ограничений.Когда я пошел, чтобы ввести их в действие, я обнаружил, что было много нарушений.

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

Ответы Грега и Брэда помогли мне в этом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top