2012-11-29 148 views
0

请看下面的非常简单的外键约束:唯一索引在INFORMATION_SCHEMA不是唯一

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],但没有规定强制执行这个名字是表或模式的之间唯一的,所以如果存在同名的另一个唯一的密钥,那么我就不能工作了,其中这外国关键点。

+0

所以你真正想要的不是索引信息,因为可能有一个你不感兴趣的唯一索引,而是你想要外键约束和它引用的字段。 –

+0

正确。我在外键信息FK(表,列[s])之后引用(表,列[s])。 – johnDisplayClass

回答

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的细节,

+0

无法内部连接到KCU2,因为UNIQUE_CONSTRAINT_NAME是索引的名称,KCU中不存在该索引的名称,因为它不是键。 – johnDisplayClass

0

有在此声明一个错误的假设: “在这个例子中,我能加入到[INFORMATION_SCHEMA] [指标] ,但是没有规则强制这个名称在表或模式之间是唯一的,所以如果另一个唯一键以同样的名字存在,那么我就无法弄清楚这个外键指向哪里。“

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

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