制約に一致しない外部キーを照会するにはどうすればよいですか?
-
06-07-2019 - |
質問
SQL Server 2005。
外部キー制約を必要としなかったとされるアプリケーションのデータベースに外部キー制約を追加しています。当然、データは信頼できなくなり、外部キーフィールドに孤立したエントリがあります。
セットアップ:
TableUserとTableOrderの2つのテーブル。
TableUserには主キー「UserID」があり、TableOrderには外部キー「UserID」があります。
TableOrder.UserIDに一致するエントリがTableUser.UserIDにない行を見つけるにはどうすればよいですか
たとえば、TableOrder.UserIDの値は250ですが、250に一致するTableUser.UserIDキーはありません。
解決
1つの方法を次に示します。
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のように使用されていましたが、コード化されていませんでした。これらは不要なオーバーヘッドであるという信念でした。したがって、すべての列がありますが、コード化された制約はありません。それらを強制するためにそれらを入れに行ったとき、私は多くの違反があることを発見しました。
質問は問題を浮き彫りにします。これらは不必要なオーバーヘッドではなく、人々が一般的なデータベースの攻撃を防止します。
グレッグとブラッドの両方の答えが私を助けてくれました。
所属していません StackOverflow