考虑以下非常简单的外键约束:
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)
"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视图实际上每个索引列包含一行(没有索引定义视图),但这意味着您可以关联外键列和唯一索引列。