我使用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:示例db结构
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和MY_PARENT_TABLE_u_nci_ID_LongName。所以真正的问题应该是:为什么要使用其他的唯一索引而不是PK??
发布于 2010-06-09 15:36:49
因为在同一列上有一个PK和一个唯一约束,所以Server会选择一个来使用。我不知道它是否选择了唯一的约束,因为它更薄(即所涉及的列更少),并且可能需要更少的读取来确认匹配(?)
我在SQL中找不到任何方法来强制执行它选择的一个,除了排序您的脚本之外--使用PK创建表,创建另一个表和FK,然后如果您真的需要它,就创建唯一的约束--但真的是这样吗?
https://stackoverflow.com/questions/3005962
复制相似问题