0

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

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

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

[INFORMATION_SCHEMA].[REFERENTIAL_CONSTRAINTS]显示了我所期望的:将外键名称[FK_Order_Person]与唯一约束名称链接的行[uindex]

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

[KEY_COLUMN_USAGE]因为我没有主键,所以连接不会产生任何结果。

在此示例中,我可以加入[INFORMATION_SCHEMA].[INDEXES],但没有规则强制此名称在表或模式之间是唯一的,因此如果存在另一个具有相同名称的唯一键,那么我将无法确定该外键指向的位置。

4

2 回答 2

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,

于 2012-11-29T14:13:53.373 回答
0

此语句中有一个错误的假设:“在此示例中,我可以加入 [INFORMATION_SCHEMA].[INDEXES],但没有规则强制此名称在表或模式之间是唯一的,因此如果存在另一个具有相同名称的唯一键,则我将无法计算出这个外键指向的位置。”

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

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

于 2014-03-17T17:50:08.260 回答