INFORMATION_SCHEMA
次のクエリで一連のビューを使用して、特定のテーブルのすべての FK 制約を一覧表示しています。
SELECT X.UNIQUE_CONSTRAINT_NAME,
"C".*, "X".*
FROM "INFORMATION_SCHEMA"."KEY_COLUMN_USAGE" AS "C"
INNER JOIN "INFORMATION_SCHEMA"."REFERENTIAL_CONSTRAINTS" AS "X"
ON "C"."CONSTRAINT_NAME" = "X"."CONSTRAINT_NAME"
AND "C"."TABLE_NAME" = 'MY_TABLE'
AND "C"."TABLE_SCHEMA" = 'MY_SCHEMA'
すべてが完全にうまく機能しますが、特定の制約でUNIQUE_CONSTRAINT_NAME
列の値が間違っているため、参照された列から追加情報を見つけるために必要です。基本的に、ほとんどの行にUNIQUE_CONSTRAINT_NAME
は、参照されるテーブル内の一意の制約 (または PK) の名前が含まれていますが、特定の 1 つの行FK
については、他の一意の制約の名前です。
FK をドロップして再作成しましたが、役に立ちませんでした。
私の仮定は、メタデータが何らかの形で台無しになっているということです。INFORMATION_SCHEMA
ビューが実際に正しいデータを表示するようにメタデータを再構築する方法はありますか?
edit-1: サンプル データベース構造
CREATE TABLE MY_PARENT_TABLE (
ID INTEGER,
NAME VARCHAR,
--//...
CONSTRAINT MY_PARENT_TABLE_PK PRIMARY KEY CLUSTERED (ID)
)
CREATE UNIQUE NONCLUSTERED INDEX MY_PARENT_TABLE_u_nci_ID_LongName ON MY_PARENT_TABLE (ID ASC) INCLUDE (SOME_OTHER_COLUMN)
CREATE TABLE MY_CHILD_TABLE (
ID INTEGER,
PID INTEGER,
NAME VARCHAR,
CONSTRAINT MY_CHILD_TABLE_PK PRIMARY KEY CLUSTERED (ID)
,CONSTRAINT MY_CHILD_TABLE__MY_PARENT_TABLE__FK
FOREIGN KEY (PID)
REFERENCES MY_PARENT_TABLE (ID)
ON UPDATE NO ACTION
ON DELETE NO ACTION
)
はUNIQUE_CONSTRAINT_NAME
になるとMY_PARENT_TABLE_PK
思いますが、得られるのはMY_PARENT_TABLE_u_nci_ID_LongName
です。
構造を見てみると、実際にはUNIQUE
その列にPK
2つの制約があることがわかりますMY_PARENT_TABLE_u_nci_ID_LongName
。したがって、本当の問題はおそらく次のとおりです。PK ではなく、他の一意のインデックスを使用するのはなぜですか?