2016-04-27 7 views
0

私はサマーキャンプのために、特にPKとFKの制約で作成しているデータベースではいくつかの問題があります。私がFK制約(例えばFOREIGN KEY(PID)がCampers(CamperID)を参照しているなど)を宣言すると、pgAdmin(私はPostgreSQLを使用しています)でコードを実行する際にエラーが発生します。たとえば、Campersテーブルはまだ作成されていませんが、これはおそらくロードブロッキングの一部または全部ですが、私のFKは何とか間違っているように感じられます。私の理解では、FKは別のテーブルのPKですが、テーブル間に冗長性や切断があるような気がします。これらのFKは必要ですか?彼らは私を止めていますか?

私は以下のCREATE文のいくつかの構文を書いています。私は(私は多少曖昧な)質問の質について叱責を受けるのかどうかはわかりませんが、少し失われて、助けやアドバイスを感謝しています。前もって感謝します!さらに明確にするため

DROP TABLE IF EXISTS People; 
CREATE TABLE People (
    PID     VARCHAR(10) NOT NULL   UNIQUE, 
    FName    TEXT    NOT NULL, 
    LName     TEXT    NOT NULL, 
    DOB      DATE    NOT NULL, 
    ArrivalDate  DATE    NOT NULL   DEFAULT CURRENT_DATE, 
    DepartureDate  DATE,    
    US_PhoneNum   VARCHAR(11)  NOT NULL, 
    StreetAddress  VARCHAR(200) NOT NULL, 
    Sex     GENDER   NOT NULL, 
    ZIP     VARCHAR(10) NOT NULL, 
PRIMARY KEY(PID), 
FOREIGN KEY(PID) REFERENCES Campers(CamperID), 
FOREIGN KEY(PID) REFERENCES Counselors(CounselorID), 
FOREIGN KEY(ZIP) REFERENCES Zip(ZIP) 
); 

DROP TABLE IF EXISTS Zip; 
CREATE TABLE Zip (
    ZIP  VARCHAR(10) NOT NULL, 
    City  TEXT    NOT NULL, 
    State  VARCHAR(2)  NOT NULL, 
    PRIMARY KEY(ZIP) 
); 

DROP TABLE IF EXISTS Campers; 
CREATE TABLE Campers (
    CamperID  VARCHAR(10) NOT NULL REFERENCES People(PID), 
    AgeGroup  AGES    NOT NULL, 
    CabinID  VARCHAR(2)  NOT NULL, 
    Bed   BEDTYPES   NOT NULL, 
    GroupID  VARCHAR(3)  NOT NULL, 
    PRIMARY KEY(CamperID), 
    FOREIGN KEY(CamperID) REFERENCES People(PID), 
    FOREIGN KEY(CabinID) REFERENCES Cabins(CabinID), 
    FOREIGN KEY(Bed)  REFERENCES Beds(Bed), 
    FOREIGN KEY(GroupID) REFERENCES Groups(GroupID) 
); 

DROP TABLE IF EXISTS Counselors; 
CREATE TABLE Counselors (
    CounselorID VARCHAR(10) NOT NULL REFERENCES People(PID), 
    GroupID   VARCHAR(3)  NOT NULL, 
    CabinID   VARCHAR(2)  NOT NULL, 
    PRIMARY KEY(CounselorID), 
    FOREIGN KEY(GroupID) REFERENCES Groups(GroupID), 
    FOREIGN KEY(CabinID) REFERENCES Cabins(CabinID) 
); 

ERRORメッセージ:

ERROR: relation "campers" does not exist 
********** Error ********** 

ERROR: relation "campers" does not exist 
SQL state: 42P01 

私が必要な場合は、のために文を作成提供することができます(明らかに)複数のテーブルがあります。

+0

'Campers'の' People(PID) 'の参照は、あなたが望むFKであり、' people'のFOREIGN KEY(PID)REFERENCES Campers(CamperID)ではありません。列定義に 'REFERENCES'がある場合は、テーブルレベルで別の' FOREIGN KEY'を必要としません。 –

+0

偉大な、私はそれを知らなかった!ありがとう@muistooshort。 – rachel

+0

次のステートメントは正確にそのエラーをスローしますか? –

答えて

0

ここから始めてください。Foreign keyリレーショナルデータベースの文脈において

、外部キーが一意 別のテーブルの行を特定のテーブル内のフィールド(またはフィールドの 集合)です。

あなたのスクリプトで何をしようとしているのは、人々、キャンプ者、カウンセラーの間に循環リンクを作成することです。また、主キーフィールドを持つと、外部キーは、参照されるすべてのテーブルのIDが同一であることを要求します。

...外部キーを作成するには、参照先のテーブルがデータベースに既に存在している必要があります。したがって、外部キーを持たないテーブルから始め、以前に作成されたテーブルだけを参照するテーブルを作成する必要があります。または、外部キーを使用せずにすべてのテーブルを作成し、すべてのテーブルが存在するときに後で追加することもできます。

...と質問に答えるために、外部キーは決して必要ではありませんが、それらは役に立ちます。