Как я могу запросить внешние ключи, которые не соответствуют их ограничениям?
SQL Server 2005.
Я добавляю ограничения внешнего ключа в базу данных приложения, которое якобы не нуждалось в них. Естественно, данные стали ненадежными, и в поле внешнего ключа появились осиротевшие записи.
Настройка:
Два стола, TableUser и TableOrder.
TableUser имеет идентификатор первичного ключа', и TableOrder имеет идентификатор внешнего ключа''.
Как мне найти строки, где TableOrder.UserID не имеет соответствующей записи в TableUser.Id_пользователя?
Для например, порядок таблиц.UserID имеет значение 250, но соответствующий TableUser отсутствует.Идентификатор ключа за 250.
3 ответа:
Вот один из способов:
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, но не кодировались - считалось, что они были ненужными накладными расходами. Итак, у нас есть все столбцы, но нет закодированных ограничений. Когда я пришел, чтобы ввести их в действие, я обнаружил, что было много нарушений.
Ваш вопрос подчеркивает проблему. Они не являются ненужными накладными расходами, они предотвращают людей от общей базы данных asshattery.
Как Грега и Брэда ответы помогли мне выбраться.