2016-11-02 13 views
0

を参照:私は何がありますので、これはされていないことを前提とし、参照テーブル「contactnumber」に指定されたキーに一致するユニークな制約がありませんPostgreSQLは、私が連絡先のテーブルを作成しようとすると、私は次のエラー受け付けております

: ERRORを連絡先表のNumberPerContact属性がありますが、1つ持っていません。私は何ができますか?

CREATE TABLE ContactNumber (
     ContactID INTEGER NOT NULL, 
     NumberPerContact INTEGER DEFAULT 0 , 
     ContactNumber VARCHAR(20) DEFAULT '', 
     PRIMARY KEY (ContactID, NumberPerContact), 
     UNIQUE(CONTACTID,NUMBERPERCONTACT) 
    ); 

CREATE TABLE Contact (
    EventName VARCHAR(30) UNIQUE NOT NULL, 
    ContactID INTEGER UNIQUE NOT NULL, 
    PRIMARY KEY (EventName,ContactID), 
    FOREIGN KEY (ContactID) REFERENCES ContactNUMBER (CONTACTID), 
    FOREIGN KEY (CONTACTID) REFERENCES CONTACTMAIL(CONTACTID), 
    FOREIGN KEY (CONTACTID) REFERENCES CONTACTNAME(CONTACTID), 
    FOREIGN KEY (CONTACTID) REFERENCES ORGANIZer(CONTACTID) 
    ); 
+0

あなたは 'ContactID'フィールドに対する外部キー制約を作成しようとしているが、それは' PRIMARY KEY'ではありません。主キーは 'ContactID、NumberPerContact'と定義されています。 'ContactNumber'テーブルに定義されている方法を変更するか、' Contact'テーブルに 'NumberPerContact'を追加し、それをあなたの' FOREIGN KEY'制約に追加する必要があります。あなたはあなたの質問に1つは望んでいないと言いますが、その2つのフィールドはレコードのフィールドを識別しています*もしそれがあなたが定義したものであれば、両方を使うべきです。 – Siyual

+0

これとは別に、 'PRIMARY KEY'として定義されている2つのフィールドに加えて、' ContactID、NumberPerContact'に対する 'UNIQUE'制約は冗長です。定義上、それらは既に「PRIMARY KEY」を介して一意である。 – Siyual

+0

ContactNumberテーブルの主キーのContactIDだけを残しておくと、両方のテーブルを作成することができました。 ContactIDとNumberPerContactの両方が一意ではなく、一意であることが必要です。 PKからNumberPerContactを削除すると失敗しました。 UNIQUQ(atr1、atr2)が期待通りに動作しない –

答えて

0

外部キー制約は、参照されるテーブル内で一意である必要があります。

したがって

FOREIGN KEY (ContactID) REFERENCES ContactNUMBER (CONTACTID) 

2のいずれかに該当する場合にのみ有効となります。

  1. ContactIDがContactNumberテーブルの主キーです。

又は

  • ContactIDはContactNumberテーブルにUNIQUE宣言されています。
  • あなたの場合、あなたは後方に行っています!

    FOREIGN KEY制約は、ContactNumberに配置する必要があり、Contactではなく配置する必要があります。ご例えば

    FOREIGN KEY (ContactID) REFERENCES Contacts (CONTACTID) 
    

    :ContactIdが接触しUNIQUEある場合

    CREATE TABLE ContactNumber (
        ContactID INTEGER NOT NULL, 
        NumberPerContact INTEGER DEFAULT 0 , 
        ContactNumber VARCHAR(20) DEFAULT '', 
        PRIMARY KEY (ContactID, NumberPerContact), 
        UNIQUE(CONTACTID,NUMBERPERCONTACT) 
        FOREIGN KEY (ContactID) REFERENCES Contact (CONTACTID), 
    ); 
    
    CREATE TABLE Contact (
        EventName VARCHAR(30) UNIQUE NOT NULL, 
        ContactID INTEGER UNIQUE NOT NULL, 
        PRIMARY KEY (EventName,ContactID), 
    ); 
    

    また、それはEVENTNAME、ContactIDより良い候補キーなので、ContactIDが主キーである必要があります。

    ContactId - > EVENTNAME

    +0

    連絡先表の考え方は次のとおりです。 イベントに連絡先があります。 連絡先に名前、番号などがあります。 これは連絡先がすべてのテーブルを参照する必要がある理由です –

    +0

    正規化のプロセスでは、confilcting属性を新しいテーブルに移動して、新しいテーブルにPKのコピーを追加する必要があります。あなたは何が働いているかもしれないと言っていますが、正しくはありません。 –

    +0

    テーブルを参照するのは良い方法です。あなたがそれを後方に行ったことだけです。 "子"テーブルで "親"テーブルを参照します。 FOREIGN KEY制約は子テーブルに入ります。 – dmg

    関連する問題