2017-04-06 710 views
2

我是SQL新手,還有很多事情我仍然不太明白。我有以下表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) 
); 

我知道要創建一個具有從該表人的外鍵,也可以作爲主鍵的主鍵的另一個表:

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

如果從三列由一個複合PK,那麼希望所有子表建立外鍵關係也要有所有3列和使用的所有3列建立FK關係。

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:是的,這個非常笨重的設置是**單獨的,單列**代理鍵**的重要原因之一** - 也使聯接更容易編寫和理解!我同意 - 但我只是想說明如果出現這種情況需要做些什麼(而且你不能改變它)。 –

0

你可能要一個唯一的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) 
); 

然後使用參考標識列:

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的主鍵。你是否只允許某人購買?如前所述,您如何生成這樣的列因數據庫而異; identity恰好是SQL Server執行此操作的方式。
+1

這個解決方案更像真實世界:) – user3885927