我使用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)的名称,但对于一个特定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
)
我希望UNIQUE_CONSTRAINT_NAME
是MY_PARENT_TABLE_PK
,但我得到的是MY_PARENT_TABLE_u_nci_ID_LongName
。
查看结构后,我发现实际上该列上有 2 个UNIQUE
约束 -PK
和MY_PARENT_TABLE_u_nci_ID_LongName
. 所以真正的问题可能应该是:为什么它需要一些其他的唯一索引而不是 PK?