2010-11-17 27 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。这解决了我的问题。感谢所有的帮助..