2014-09-21 37 views
1
CREATE TABLE housing (
    name varchar(15), 
    address varchar(15), 
    city varchar(15), 
    state varchar(15), 
    zip integer, 
    PRIMARY KEY(address, zipcode) 
); 

CREATE TABLE room (
    num integer PRIMARY KEY, 
    capacity integer, 
    name varchar(15) REFERENCES housing(name) 
); 

我有這兩個表應該被創建。第一個創建得很好,但是當第二個輪胎創建時,它告訴我沒有唯一的約束匹配給定的鍵「表」構建沒有唯一的約束匹配給定的關鍵也最終使關係不存在

我是相當新的postgresql,所以我老實說不知道。我在這裏搜索並發現了一些類似的東西,但那些只是說,指定的字段不夠獨特,我還沒有真正理解(也正是錯誤所說的)。我是否沒有專門引用建築物的名稱或者什麼?

在創建使用房間表的線下面的表時,它告訴我房間關係不存在,但我認爲它處理這一個錯誤。

任何幫助,將不勝感激。

+1

這不是關於PostresSql的關於關係理論。如果它不是唯一的,你就不能引用它。想想看。如果多於一個,你會如何隨便挑選一個價值?你不能。名稱列不是唯一的。故事結局。 – 2014-09-22 00:00:22

回答

3

第一個(「住房」)不可能被創建。自己嘗試。

要解決此問題,您需要更改「住房」的結構,或更改「房間」的結構。這是修復「住房」結構的一種方法。 (不要做這些修正 - 沒什麼比讓一個外鍵的工作等着我們去做。)

CREATE TABLE housing (
    name varchar(15) not null unique, 
    address varchar(15), 
    city varchar(15), 
    state varchar(15), 
    zipcode integer, 
    PRIMARY KEY(address, zipcode) 
); 

其他列應該可能聲明not null了。

下面是修復「房間」結構的一種方法。

CREATE TABLE room (
    num integer PRIMARY KEY, 
    capacity integer, 
    address varchar(15) not null, 
    zipcode integer not null, 
    foreign key (address, zipcode) references housing (address, zipcode) 
); 

現在,一些其他的問題。表格的原始結構包括這種嘗試在外鍵引用。

name varchar(15) REFERENCES housing(name) 

這意味着你相信「名字」標識了一個「住房」。但在原表中,「姓名」不是確定了「住房」;一對列「地址」和「郵編」標識「住房」。現在,我不知道這裏的「名字」是什麼意思,我不想猜測。這可能是住房的名稱(無論這意味着什麼),它可能是住戶的名字,也可能是某種其他類型的名字。無論如何,給「名稱」一個更好的名字。根據美國郵政服務機構的說法,在美國,地址長度最長可達64個字符。一些城市名稱超過15個字符。郵政編碼不是整數。郵政編碼可以有前導零;整數不能。使用char(5)作爲五位郵政編碼。還要考慮在CHECK約束內使用正則表達式,以確保郵政編碼中只能使用數字0-9。

使用num作爲「房間」的主鍵是大概是一個壞主意。如果它指的是實際的房間號碼,那麼您的數據庫中只能有一個房間100。如果它不涉及實際的房間號碼,則無法合理識別房間。這張桌子需要更多的工作。您需要對容量進行CHECK約束以確保其大於零。

相關問題