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

[Person]最初に、にPKがなく、への外部キー参照を作成できる一意のインデックスのみがあることに気付くでしょう[Person].[id]

[INFORMATION_SCHEMA].[REFERENTIAL_CONSTRAINTS]は、私が期待することを示しています。外部キー名[FK_Order_Person]と一意性制約名をリンクする行[uindex]です。

だから私の質問は:INFORMATION_SCHEMASQL Server Compactで使用することを余儀なくされていますが、インデックスのテーブルと列の情報はどこで入手できます[uindex]か?

主キーがないため、結合して[KEY_COLUMN_USAGE]も何も生成されません。

この例では、に参加でき[INFORMATION_SCHEMA].[INDEXES]ますが、この名前がテーブルまたはスキーマ間で一意になるように強制するルールはないため、同じ名前で別の一意のキーが存在する場合、この外部キーがどこを指しているのかを特定できません。

4

2 に答える 2

0

このステートメントには誤った仮定があります: 「この例では、[INFORMATION_SCHEMA].[INDEXES] に結合できますが、この名前をテーブル間またはスキーマ間で一意にするルールはありません。したがって、別の一意のキーが同じ名前で存在する場合、この外部キーがどこを指しているのか、私にはわかりません。」

Sql Compact にはスキーマが 1 つしかないため、テーブル名とインデックス名の組み合わせは一意です。さらに、ビュー INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS には、一意制約テーブルの名前と一意制約名が含まれています。(これは、同等の Sql Server ビューとは異なります)

ただし、INDEXES ビューには実際にはインデックス列ごとに 1 つの行が含まれますが (インデックス定義ビューはありません)、これは、外部キー列と一意のインデックス列を関連付けることができることを意味します。

于 2014-03-17T17:50:08.260 に答える
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 に答える