web-dev-qa-db-ja.com

SQL Server 2008:テーブルの列が既存の主キーまたは一意の制約と一致しません

SQL Server 2008データベースにいくつかの変更を加える必要があります。

これには、新しいテーブルを作成し、既存のテーブルのプライマリキーを参照する新しいテーブルに外部キーを挿入する必要があります。そこで、tblOneの主キーを参照する新しいtblTwoの間に関係を設定します。

ただし、(SQL Server Management Studioを介して)これを実行しようとすると、次のエラーが発生しました。

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

私はこれが何を意味するのか本当にわかりません、そして、私はそれの周りに方法があるかどうか疑問に思っていましたか?

52
109221793

これは、tblOneの主キーが適切に宣言されていないことを意味します。tblOneに移動し、PRIMARY KEY制約を追加する必要があります。

TblOneにPRIMARY KEY制約があることが確実な場合、DBに異なるスキーマに属する複数のtblOneテーブルがあり、FK制約の参照句が間違ったテーブルを選択している可能性があります。

複合キーがある場合(コメントが示すように)、外部キー参照にも両方の列を含める必要があります。テーブルに複数の主キーを含めることはできませんが、複合キーがある場合は、主キーの一部である各列の横にキーシンボルが表示されます。

78

複合キーがある場合は、FKを作成するときに順序が重要であり、順序が表示されないことがあります。

私がやることは、table1のキーセクションに移動し、クリップボードに作成するスクリプトの主キーを選択し、スクリプトに示されている順序を使用してFKを作成することです

54
alanh

上記の回答からのすべてのアドバイスに従った後、それでもエラーが表示される場合、すべてが正しく見えます。

これを修正する1つの方法は、両方のテーブルのプライマリキーを削除し、保存、更新、再度追加することです。その後、再び関係を追加してみてください。

5
Ruan

私はこの状況に直面して、このトピックに至りました。同じエラーですが、別の原因です。たぶんそれは誰かを助けるでしょう。

Table1
ColA (PK)
ColB (PK)
ColC


Table2
ID (PK)
ColA
COLB

Table2で外部キーを作成しようとすると、コンボボックスから値を逆順に選択しました

Table1.ColB = Table2.ColB
Table1.ColA = Table2.ColA

これにより、トピック名のようなエラーがスローされました。主キーテーブルの列の順序を維持したままFKを作成すると、エラーがなくなりました。

愚かですが、.. :)

4
100r

私と一緒にこのエラーが発生しましたWhenadd foreign keyから始まるPrimaryKey Table制約を試みました

他のテーブルに移動し、create this foreign key制約fromがそこにある(foreign key Table)

3

この問題に気づき、間違ったテーブルに関係を追加していました。したがって、テーブルAの関係をテーブルBに追加しようとしている場合は、テーブルBの関係をテーブルAに追加してみてください。

2

列名が一致する必要があることがわかりました。

例:したがって、tblOneにcategoryIdというIDがある場合、tblTwoの参照もcategoryIdと呼ばれる必要があります。

_tblname, primary key name, foreign key_
tblOne, "categoryId", none
tblTwo, "exampleId", "categoryId"

主キーとして列名「id」を持つ2つのテーブル間に外部キーを作成しようとすると、このことに気付きました。

0
Per G

テーブルにデータがある場合、これが問題になる可能性があります。

私の場合、午後3時にロードしたAccountテーブルのデータと午後3時10分にロードしたContactテーブルのデータがあったため、ContactテーブルにはまだAccountテーブルにない値がありました。

連絡先テーブルからこれらの値を削除することになり、問題なくキーを追加できました。

0
Pete Kozak

何も役に立たない場合、これが理由である可能性があります:このケースを考慮してください:表A:列1(主キー)列2(主キー)列3列4

表B:列a(主キー)列b列c

bからAへの依存関係を定義する場合、プライマリが定義されている順序を順守する必要があります。

つまり、依存関係は次のようになります。表A表B列1列b列2列c

AND NOT:表A表B列2列c列1列b

これにより、発生しているエラーが発生します。

0
Samsky

このエラーを取得する別の方法を見つけました。これは、SQL Management Studioのデザインビューで再帰的な外部キー(同じテーブルのプライマリキーに対する外部キー)を作成しようとした場合にも発生する可能性があります。主キーでテーブルをまだ保存していない場合、このメッセージが返されます。テーブルを保存するだけで、外部キーを作成できます。

0
Caimen

TblOneのプライマリキーまたは一意のインデックスと一致しない(または参加しない)tblTwoの外部キーを作成しようとしているようです。

このリンクを [〜#〜] msdn [〜#〜] で確認してください。ここに、 実用的なケース の別のリンクがあります。

編集:

あなたのコメントに答えて、私はあなたが主キーに2つのフィールドがあることを意味することを理解しています(それはそれを複合にします)。 SQLでは、同じテーブルに2つの主キーを持つことはできません。

私見、外部キーフィールドは常に、参照されるテーブルの単一のレジスタ(つまり、あなたの場合は主キー全体)を参照する必要があります。つまり、外部キーを作成する前に、tblOneプライマリキーの両方のフィールドをtblTwoに入れる必要があります。

とにかく、私はインターネットで少し調査しましたが、SQL Server 2008(以前のバージョンや他のRDBMSのように)は、この部分が候補キー(Not Nullおよびユニーク)そして、あなたはそれにユニークな制約を作成します。

あなたがあなたのケースでそれを使用できるかどうかはわかりませんが、これについての詳細は link を確認してください。

0
Guillem Vicens