REFERENTIAL_CONSTRAINTS 中 UNIQUE_CONSTRAINT_NAME 的值不正确

van*_*van 3 sql-server metadata information-schema sql-server-2008

我使用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'
Run Code Online (Sandbox Code Playgroud)

一切正常,但对于一个特定的约束,UNIQUE_CONSTRAINT_NAME列的值是错误的,我需要它以便从引用的列中找到其他信息。基本上,对于大多数行,它UNIQUE_CONSTRAINT_NAME包含引用表中唯一约束(或 PK)FK的名称,但对于一个特定的行,它是其他一些唯一约束的名称。

我放弃并重新创建了 FK - 没有帮助。

我的假设是元数据在某种程度上被搞砸了。有没有办法重建元数据,以便INFORMATION_SCHEMA视图实际显示正确的数据?

编辑 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
)
Run Code Online (Sandbox Code Playgroud)

我希望UNIQUE_CONSTRAINT_NAMEMY_PARENT_TABLE_PK,但我得到的是MY_PARENT_TABLE_u_nci_ID_LongName

查看结构后,我发现该列实际上有 2 个UNIQUE约束 -PKMY_PARENT_TABLE_u_nci_ID_LongName. 所以真正的问题应该是:为什么它需要一些其他的唯一索引而不是 PK?

Tom*_*m H 5

由于您在同一列上同时具有 PK 和 UNIQUE 约束,SQL Server 会选择一个使用。我不知道它是否选择 UNIQUE 约束,因为它更薄(即涉及的列更少)并且可能需要更少的读取来确认匹配(?)

除了对脚本进行排序之外,我在 SQL 中看不到任何方法来强制执行它选择的脚本-使用 PK 创建表,创建另一个表和 FK,然后在您确实需要时创建 UNIQUE 约束-但是真的如此吗?