2010-11-17 24 views
1

我有使用查詢外鍵發出

CREATE TABLE branch_dim ( 
    branch_id numeric(18,0) NOT NULL, 
    country_name varchar(30), 
    island_name char(30),  
    region_name varchar(30), 
    branch_name varchar(30), 
    region_manager varchar(30), 
    marketing_manager varchar(30), 
    branch_manager varchar(30), 
    promoter_main varchar(30), 
    promoter_other varchar(30), 
    PRIMARY KEY (branch_id,island_name) 
) ON branch_dim_scheme(island_name) 

表中創建現在我有另一個表

CREATE TABLE order_fact ( 
    branch_id numeric(18,0) NOT NULL, 
    product_id numeric(18,0) NOT NULL, 
    order_id numeric(18,0) NOT NULL, 
    day_id numeric(18,0) NOT NULL, 
    FOREIGN KEY (branch_id) REFERENCES branch_dim (branch_id), 
) 

第一個查詢中有分區,這就是爲什麼我有2個主鍵。現在,如果我運行第二個查詢我收到錯誤

「有被引用表 ‘branch_dim’的 參考列清單在國外 鍵「沒有匹配的主鍵或 候選鍵FK_order_fac_branc_10234AD '「

可能是什麼問題?

+0

這將有助於知道這是數據庫,因爲答案可能會有所不同,具體取決於特定的數據庫。 – HLGEM 2010-11-17 15:16:32

+0

哎呀!對不起!它是SQL Server 2008 – Deepak 2010-11-17 15:17:23

回答

1

你的表有一個複合主鍵:

CREATE TABLE branch_dim (

PRIMARY KEY (branch_id,island_name) 

因此,任何外鍵引用該表必須同時使用元素的外鍵(你需要引用的關鍵,全鍵,不過按鍵 - 所以幫你科德:-):

CREATE TABLE order_fact ( 
    branch_id numeric(18,0) NOT NULL, 
    island_name char(30), 
    product_id numeric(18,0) NOT NULL, 
    order_id numeric(18,0) NOT NULL, 
    day_id numeric(18,0) NOT NULL, 

    FOREIGN KEY (branch_id, island_name) 
    REFERENCES branch_dim (branch_id, island_name) 

建議的字:任何事情超過5個字符左右,我就從來沒有使用CHAR(x)作爲數據類型 - 這將創建一個字段,它是總是長度爲30個字符 - 是否在其中存儲多個字符。如果您存儲的數量較少,則將值填充空格至指定的長度(30個字符)。

對於任何大於5左右的字符,我建議總是改爲使用VARCHAR

同樣適用於numeric(18,0):對於ID字段,我總是使用INT - 更好,更清潔,更小,只是更好!

+0

這裏的問題是我不應該在order_fact表中添加island_name。 order_fact表就像數據字典。 – Deepak 2010-11-17 15:33:13

+0

我可以將主鍵減少到一個,而不是兩個。但問題在於分區。我已經在「island_name」字段中完成了分區,所以有什麼方法可以對單個鍵(branch_id單獨使用)執行相同操作? – Deepak 2010-11-17 15:41:05

+0

@deepak:「分區」是什麼意思? – 2010-11-17 16:12:46

4

您已將branch_dim上的主鍵定義爲由branch_id和island_name組成的複合主鍵。當你創建order_fact時,你試圖只引用branch_id作爲你的外鍵。

+0

所以我該怎麼辦?我是否需要在第二個表中添加island_name字段?有沒有其他方式可以做到這一點,而不需要將island_name添加到第二個表中? – Deepak 2010-11-17 15:20:17

+0

這是一個比較大的數據庫設計問題,它會真正理解你爲了回答它而試圖做什麼。但是,肯定有一些選擇。首先,如果你真的想在branch_dim中唯一標識一行,那麼外鍵需要和主鍵相同,所以你需要添加一個類似order_fact的列。如果branch_id足以準確識別branch_dim中的行,則可以修改該表結構以僅將branch_id用作主鍵。這確實取決於你如何計劃構建和識別你的數據。 – MikeTheReader 2010-11-17 15:25:18

+0

我認爲你應該花一些時間來了解索引,主鍵和外鍵以及聚簇索引。本文http://www.15seconds.com/issue/020522.htm可能會有所幫助,但我最擔心的是您使用的是數字來表示id。 – marr75 2010-11-17 15:27:01

0

您需要將branch_dim的主鍵設置爲branch_id並在island_name上添加索引。另外,你是branch_ids真正的數字(18,0)?如果是這樣,我會做一個代理主鍵(可以自動增加,int或bigint,身份)。

事實上,您的主鍵(因此聚簇索引)非常寬。這會降低性能,我猜測,在你的情況下,將聚集索引分段(壞)。

0

我解決了問題,將主鍵字段(branch_id)設置爲NONCLUSTERED和UNIQUE,並將island_name字段設置爲,因此我只有一個主鍵,而我的分區鍵是island_name。這解決了我的問題。感謝所有的幫助..