我有一个使用查询
创建的表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 :(得分: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。这解决了我的问题。谢谢大家的帮助......