外键问题

时间:2010-11-17 15:15:20

标签: sql sql-server-2008 foreign-keys

我有一个使用查询

创建的表
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'“

可能是什么问题?

4 个答案:

答案 0 :(得分:4)

您已将branch_dim上的主键定义为由branch_id和island_name组成的复合主键。当您创建order_fact时,您尝试仅引用branch_id作为外键。

答案 1 :(得分:1)

您的表格有一个复合主键:

CREATE TABLE branch_dim (

PRIMARY KEY (branch_id,island_name)

因此,对该表的任何外键引用必须使用两个元素作为其外键(您需要引用键,整个键,除了键之外的其他内容 - 所以帮助你Codd: - ):

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 - 更好,更清洁,更小,更简单!

答案 2 :(得分:0)

您需要将branch_dim的主键设为branch_id,并在island_name上添加索引。另外,你的branch_ids真的是数字(18,0)吗?如果是这样,我会创建一个代理主键(可以自动递增,int或bigint,identity)。

实际上,您的主键(以及聚簇索引)非常宽。这会降低性能,我猜你在你的场景中会破坏你的聚集索引(坏)。

答案 3 :(得分:0)

我通过将主键字段(branch_id)设置为NONCLUSTERED和UNIQUE并将island_name字段设为as来解决了问题,因此我只有一个主键,而我的分区键是island_name。这解决了我的问题。谢谢大家的帮助......