web-dev-qa-db-ja.com

SQL Serverの2列のプライマリキーを参照する外部キー

この質問は this one とほぼ同じですが、SQL Server 2005の場合:

データベースに2つのテーブルがあります。

--'#' denotes the primary key
[Libraries]
#ID   #Application  Name
 1     MyApp        Title 1
 2     MyApp        Title 2


[Content]
#ID   Application  LibraryID  Content
 10    MyApp       1          xxx
 11    MyApp       1          yyy

(データベースは明らかにはるかに複雑であり、この二重キーを持つことは理にかなっています)

各ライブラリは、一意のIDとアプリケーション名で識別されます。各コンテンツが既存のライブラリを適切に参照していることを確認しようとしています。

(ウィザードを使用して)制約を作成するとき

Primary key table            Foreign key table
[Libraries]                  [Content]
ID                  --->     LibraryID
Application         --->     Application

次のエラーがあります。

テーブル 'Libraries'の列は、既存の主キーまたはUNIQUE制約と一致しません

何が起こっているのかご存知ですか?そして、それがSQL Serverを使用してまったく可能かどうか? ([ライブラリ]テーブルをまったく変更できません)

ご協力ありがとうございました!

29
Luk

もちろん、複合(複数の列)主キーとの外部キー関係を作成することは可能です。その関係を作成するために使用しているステートメントは表示されませんでした。次のようになります。

ALTER TABLE dbo.Content
   ADD CONSTRAINT FK_Content_Libraries
   FOREIGN KEY(LibraryID, Application)
   REFERENCES dbo.Libraries(ID, Application)

それはあなたが使っているものですか?? (ID, Application)dbo.Librariesの主キーである場合、このステートメントは確実に機能します。

Luk:確認するだけです-データベースでこのステートメントを実行し、出力を報告してください。

SELECT
    tc.TABLE_NAME,
    tc.CONSTRAINT_NAME, 
    ccu.COLUMN_NAME
FROM 
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
INNER JOIN 
    INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu 
      ON ccu.TABLE_NAME = tc.TABLE_NAME AND ccu.CONSTRAINT_NAME = tc.CONSTRAINT_NAME
WHERE
    tc.TABLE_NAME IN ('Libraries', 'Content')
46
marc_s

フィールドは同じ順序でなければならないことに注意してください。参照している主キーが(アプリケーション、ID)として指定されている場合、外部キーは2つの異なるキーとして認識されるため、(アプリケーション、ID)とNOT(ID、アプリケーション)を参照する必要があります。

8
Will Russell

キーは「列の順序は同じでなければなりません」です

例:

create Table A (
    A_ID char(3) primary key,
    A_name char(10) primary key,
    A_desc desc char(50)
)

create Table B (
    B_ID char(3) primary key,
    B_A_ID char(3),
    B_A_Name char(10),
    constraint [Fk_B_01] foreign key (B_A_ID,B_A_Name) references A(A_ID,A_Name)
)

テーブルAの列の順序は-> A_IDその後A_Name;外部キーの定義も同じ順序に従う必要があります。

2
danny

Contentテーブルには、Applicationにマップできない複数の重複したLibraries値がある可能性があります。 Application主キーインデックスからLibraries列を削除し、代わりに一意のキーインデックスとして追加することは可能ですか?

1
Adrian Godong

私は同じ問題を抱えていて、解決策があると思います。

テーブルApplicationのフィールドLibraryに、別のテーブルのフィールドを参照する外部キー(Applicationという名前が付けられます)がある場合、フィールドApplicationテーブルLibraryにも、テーブルApplicationへの外部キーが必要です。

その後、作成した外部キ​​ーを実行できます。

下手な英語をすみません。間違っていたらごめんなさい。

0
Alex France