表创建中的外键错误

时间:2012-03-14 08:09:38

标签: sql-server-2005

我创建了一个包含复合主键的表。当我在其他表中引用其中一个复合主键列时,我收到错误,而且我无法创建外键关系。

错误消息:

  

引用的表中没有主键或候选键   't_app_arcv_tbl'匹配外部的引用列列表   键'fk_APPLICATION_CD'。

包含复合主键的表

Create table t_app_arcv_tbl
(
    APPLICATION_CD varchar(10),     
    TBL_NM varchar(50) not null ,
    ARCV_TBL_TYP_CD char(2) not NULL constraint fk_Arcv_TBL_TYP_CD foreign key references t_app_arcv_tbl_typ(ARCV_TBL_TYP_CD) , 
    ACT_ID Char(1) not NULL,
    OPER_ID varchar(50) not NULL,       
    PSTDT datetime not NULL         
    Constraint PK_AppName_TblNM PRIMARY KEY(APPLICATION_CD,TBL_NM)
)

下表我正在尝试使用外键约束

创建

*

-- Create Table Script for archival process Tracking
create table t_app_arcv_log         
(
    APPLICATION_CD varchar(10) not NULL constraint fk_APPLICATION_CD foreign key references t_app_arcv_tbl(APPLICATION_CD),         
    TBL_NM varchar(50) constraint fk_TBL_NM foreign key references t_app_arcv_tbl(TBL_NM),
    XTRCT_DT datetime,
    ARCV_TYP_CD char(2) not NULL constraint fk_Arcv_TYP_CD foreign key references t_app_arcv_typ(ARCV_TYP_CD),          
    STRT_DT datetime,
    END_DT datetime,
    ROW_CNT_BFR int,
    ROW_CNT_AFT int,
    ARCV_STTS_CD char(1) not null,
    OPER_ID varchar(50) not NULL,       
    PSTDT datetime not NULL
)

请帮助我如何创建具有外键关系的表。

提前致谢!

- 此致 朗高

1 个答案:

答案 0 :(得分:1)

如果主表定义了复合主键

 PRIMARY KEY(APPLICATION_CD,TBL_NM)

然后,所有想要引用该表的表必须使用整个复合键作为其FK引用。你不能只引用主键的一部分 - 它是整个键或什么都没有。

您的子表中需要两列

CREATE TABLE dbo.t_app_arcv_tbl
(
    APPLICATION_CD varchar(10),     
    TBL_NM varchar(50) not null ,
    ARCV_TBL_TYP_CD char(2) not NULL,
    TBL_NM varchar(50) not null ,  -- <== ADD THIS
    ACT_ID Char(1) not NULL,
    OPER_ID varchar(50) not NULL,       
    PSTDT datetime not NULL         
    Constraint PK_AppName_TblNM PRIMARY KEY(APPLICATION_CD,TBL_NM)
)

-- add foreign key constraint - it **MUST** define and use **BOTH** columns 
-- from the PK of the referenced table!
ALTER TABLE dbo.t_app_arcv_tbl
ADD CONSTRAINT fk_Arcv_TBL_TYP_CD 
FOREIGN KEY (ARCV_TBL_TYP_CD, TBL_NM)
REFERENCES dbo.t_app_arcv_tbl_typ