2017-04-06 30 views
2

私はSQLを初めて使用していますが、まだ理解していないようなことがたくさんあります。 I次の表SQL:外部キーが複合主キーを参照しています

CREATE TABLE Person 
(
    First_Name varchar(20) NOT NULL, 
    Name varchar(20) NOT NULL, 
    Address varchar(50) NOT NULL, 

    PRIMARY KEY (First_Name, Name, Address) 
); 

を持っている私は、外部キーも主キーとしてテーブルの人からの主キーを持つ別のテーブルを作成したい知っている:これは「doesnのいくつかの理由について

CREATE TABLE Purchase 
(
    No_Installments int, 
    Rate int, 
    Person varchar(50) NOT NULL PRIMARY KEY, 

    CONSTRAINT PFK 
     FOREIGN KEY (Person) REFERENCES Person (First_Name, Name, Address) 
); 

を私は毎回エラーが出ます。私はすでにstackoverflow上で他のスレッドを見てきましたが、実際には私を助けてくれないようです。私は間違って何をしていますか?

+1

使用しているデータベースにタグを付けてください。 –

答えて

4

あなたは3つの列から構成される化合物のPKを持っている場合は、外部キー関係を確立することを望んでいるすべての子テーブルにもFKを確立するために、すべての3列すべてのものを3つのカラムと使用を持っている必要があります関係。

FK-PKの関係は、オール・オア・ナッシング提案です - あなたは、主キーの部分だけを参照することはできません - あなたはすべて列を参照のどちらか - またはあなたが参照していません。

CREATE TABLE Purchase 
(
    No_Installments int, 
    Rate int, 

    Person varchar(50) NOT NULL PRIMARY KEY, 

    First_Name varchar(20) NOT NULL, 
    Name varchar(20) NOT NULL, 
    Address varchar(50) NOT NULL, 

    CONSTRAINT PFK 
     FOREIGN KEY (First_Name, Name, Address) 
     REFERENCES Person (First_Name, Name, Address) 
); 
+1

私は誰もが現実世界でこれを行うだろうと思う。より良いアプローチは、単一の主キーを作成し、他の列に一意の制約を適用することです。 – user3885927

+0

@ user3885927:はい、これはむしろぎっしりとした設定です** **別個の単一列の代理キー**の大きな理由の1つです** - 結合をもっと簡単に書くことができます!私は同意します - しかし、私はちょうどこれが状況である場合(そしてあなたはそれを変更することができなかった場合)に必要なものを示したいと思っていました。 –

0

はおそらくない一意であることが自分の名前に頼っまたはアドレスが必要とされるために、各ユーザに一意のIDを割り当てます。そのIDがプライマリキーと外部キーになります。プライマリキーは一意でなければならないため、購入テーブルにはプライマリキーのIDも必要です。

CREATE TABLE Person (
    id serial NOT NULL, 
    First_Name varchar(20) NOT NULL, 
    Name varchar(20) NOT NULL, 
    Address varchar(50) NOT NULL, 
    PRIMARY KEY (id)); 

CREATE TABLE Purchase (
    id serial NOT NULL, 
    No_Installments int, 
    Rate int, 
    Person int NOT NULL, 
    FOREIGN KEY (Person) REFERENCES Person (id), 
    PRIMARY KEY (id)); 
1

データベース用identityauto_incrementserialまたは何を使用して、整数主キーを持っている:

CREATE TABLE Person (
    PersonId int identity PRIMARY KEY 
    First_Name varchar(20) NOT NULL, 
    Name varchar(20) NOT NULL, 
    Address varchar(50) NOT NULL, 
    CONSTRAINT unq_person_3 UNIQUE (First_Name, Name, Address) 
); 

そして、参考のためにID列を使用します。

CREATE TABLE Purchase (
    PurchaseId int identity PRIMARY KEY, 
    No_Installments int, 
    Rate int, 
    PersonId int, 
    CONSTRAINT PFK 
     FOREIGN KEY (PersonId) REFERENCES Person (PersonId) 
); 

注:

  • 複合主キーを処理する必要はありません。あなたは結合がどのように見えるか考えましたか?
  • 値が変更される主キーは必要ありません。誰かが自分の名前を変更するとどうなりますか?誰かが動いたら?
  • Personは、Purchasesのプライマリキーであってはなりません。あなたは誰かに1回の購入を許可するだけですか?
  • 最初に述べたように、このような列を生成する方法はデータベースによって異なります。 identityは、SQL Serverがこれを行う方法です。
+1

このソリューションは、より現実的な世界です:) – user3885927

関連する問題