3

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その列にPK2つの制約があることがわかりますMY_PARENT_TABLE_u_nci_ID_LongName。したがって、本当の問題はおそらく次のとおりです。PK ではなく、他の一意のインデックスを使用するのはなぜですか?

4

1 に答える 1

5

同じ列に PK 制約と UNIQUE 制約の両方があるため、SQL Server はいずれかを選択して使用します。UNIQUE 制約を選択するかどうかはわかりません。これは、より薄い (つまり、含まれる列が少ない) ため、一致を確認するための読み取りが少なくて済む可能性があるためです (?)

スクリプトを注文する以外に、SQL内でどちらを選択するかを強制する方法はありません-PKでテーブルを作成し、他のテーブルとFKを作成し、本当に必要な場合はUNIQUE制約を作成します-しかし、それは本当にそうですか?

于 2010-06-09T15:36:49.390 に答える