唯一索引在INFORMATION_SCHEMA中不唯一

时间:2012-11-29 13:45:24

标签: sql sql-server-ce

考虑以下非常简单的外键约束:

CREATE TABLE [Person]([id] uniqueidentifier NOT NULL, [name] nvarchar(400) NULL)
GO

CREATE TABLE [Order]([id] uniqueidentifier NOT NULL, [pid] uniqueidentifier NOT NULL)
GO

/****** Index: [uindex] ******/
CREATE UNIQUE INDEX [uindex] on [Person] ([id])
GO

/****** ForeignKey: [FK_Order_Person] ******/
ALTER TABLE [Order] ADD  CONSTRAINT [FK_Order_Person] FOREIGN KEY([pid])
REFERENCES [Person] ([id])
GO

您首先会注意到[Person]上没有PK,只有一个唯一索引允许我创建[Person].[id]的外键引用。

[INFORMATION_SCHEMA].[REFERENTIAL_CONSTRAINTS]显示了我的期望:将外键名称[FK_Order_Person]与唯一约束名称[uindex]相关联的行。

所以我的问题是:在SQL Server Compact中强制使用INFORMATION_SCHEMA,从哪里获取索引[uindex]的表和列信息?

由于我没有主键,因此[KEY_COLUMN_USAGE]的联接不会产生任何结果。

在此示例中,我可以加入[INFORMATION_SCHEMA].[INDEXES],但没有规则强制此名称在表或模式之间是唯一的,因此如果另一个唯一键存在于同一名称,那么我将无法工作这个外键所在的地方。

2 个答案:

答案 0 :(得分:0)

                "SELECT KCU1.TABLE_NAME AS FK_TABLE_NAME,  KCU1.CONSTRAINT_NAME AS FK_CONSTRAINT_NAME, KCU1.COLUMN_NAME AS FK_COLUMN_NAME, " +
            "KCU2.TABLE_NAME AS UQ_TABLE_NAME, KCU2.CONSTRAINT_NAME AS UQ_CONSTRAINT_NAME, KCU2.COLUMN_NAME AS UQ_COLUMN_NAME, RC.UPDATE_RULE, RC.DELETE_RULE, KCU2.ORDINAL_POSITION AS UQ_ORDINAL_POSITION, KCU1.ORDINAL_POSITION AS FK_ORDINAL_POSITION " +
            "FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS RC " +
            "JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU1 ON KCU1.CONSTRAINT_NAME = RC.CONSTRAINT_NAME " +
            "JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU2 ON  KCU2.CONSTRAINT_NAME =  RC.UNIQUE_CONSTRAINT_NAME AND KCU2.ORDINAL_POSITION = KCU1.ORDINAL_POSITION AND KCU2.TABLE_NAME = RC.UNIQUE_CONSTRAINT_TABLE_NAME " +
            "WHERE KCU1.TABLE_NAME = '" + tableName + "' " +
            "ORDER BY FK_TABLE_NAME, FK_CONSTRAINT_NAME, FK_ORDINAL_POSITION"

然后需要对它们进行分组,请参阅我的脚本API以获取详细信息,

答案 1 :(得分:0)

本声明中有一个错误的假设: “在这个例子中,我可以加入[INFORMATION_SCHEMA]。[INDEXES],但是没有规则强制该名称在表或模式之间是唯一的,所以如果另一个唯一键存在于同一个名称,那么我将无法工作这个外键指向的位置。“

在Sql Compact中只有一个模式,因此table-name和index-name组合是唯一的。 此外,视图INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS确实包含唯一约束表的名称以及唯一约束名称。 (这与等效的Sql Server视图不同)

但请注意,INDEXES视图实际上每个索引列包含一行(没有索引定义视图),但这意味着您可以关联外键列和唯一索引列。