2016-06-16 10 views
1

非常に基本的なスクリプトが私を狂わせてしまいます。それは参照されたキーを見つけることができないと言います。それが何であるか全く分かりません。私はSQL Server 2014を使用しています。このスクリプトはデータベーステーブルの作成用です。私はテーブルTABLE_2id_TABLE_1をテーブルTABLE_1のIDを参照しようとしています。SQL Serverテーブルの作成エラー:参照にプライマリキーまたは候補キーがありません

CREATE TABLE TABLE_1 
(
    id int identity, 
    email varchar(50) not null, 

    constraint PK_TABLE_1 primary key (id,email) 
) 
GO 

CREATE TABLE TABLE_2 
(
    id int identity, 
    id_TABLE_1 int not null, 

    constraint PK_TABLE_2 primary key (id), 
    constraint FK_TABLE_2 foreign key (id_TABLE_1) 
     references TABLE_1(id) on delete cascade 
) 
GO 

エラーは次のとおりです。

メッセージ1776、レベル16、状態0、ライン32
参照に一致する参照先テーブル 'TABLE_1' にはプライマリまたは候補キーがありません外部キー 'FK_TABLE_2'の列リスト。

メッセージ1750、レベル16、状態0、ライン32は、制約またはインデックスを作成できませんでした。以前のエラーを参照してください。

ここでお手伝いできますか?

+1

エラーメッセージは、何が間違っているのかを正確に説明しています。 'OBJET_GEO.id'列にはインデックスがありません。 –

+1

いいえ、主キーは 'id、email_utilisateur'列を含む複合キーです。 –

答えて

5

コメントごとに、存在しないインデックスを参照しようとしています。 TABLE_1テーブルの主キーは、idemailの2つの列を含む複合キーです。これはコンパイルするために

、あなたがあなたの主キーを変更することができ、次のいずれか

CONSTRAINT PK_TABLE_1 PRIMARY KEY (id) 

か、単にid列に新しいインデックスを作成:

CREATE INDEX IX_TABLE_1_id ON TABLE_1 (id); 
+1

私はそれを見たこともありませんでした。私がやることは、 'id'を主キーにしてUNIQUE(id、email)を組み合わせとして使用することです。 –

+0

' id'と 'email'にユニークなインデックスを追加することについて、行ごとに一意の電子メールアドレスが必要な場合は、一意のインデックスに 'email'だけを含めます。 –

-1

をそれに意味がありません。 ID列を含む複合主キーがあります。 idカラムはすでにユニークで非NULLなので、プライマリキーである必要があります。

電子メールを一意にする場合は、電子メールを一次キーから削除し、一意であると宣言します。

+0

私の問題とは関係ありません。あなたのアドバイスをありがとう。 –

+0

2つの列で構成された複合クラスタリング・キーがよく見られます。たとえば、 '(OrderKey、OrderLineKey)'は、同じ順序のすべての行が確実に一致するようにします。また、通常は同時に作成されるため、インデックスの断片化は問題になりません。 (つまり、アイデンティティ列が最初にある場所は見たことがありません) –

+0

@JonathanAllenルーキーとして、私はUNIQUEまたはPK制約のフィールドの順番の違いをよく見ません。 –

関連する問題