2013-12-18 66 views
0

我想在外部關鍵約束條件下的SQL Server上創建一個表。我檢查了我所有的父表和它們的主鍵與我的新外鍵約束匹配。有人可以幫我解決這個問題。我的DDL和錯誤信息如下。在SQL Server表創建過程中出現外鍵約束錯誤

DDL

CREATE TABLE I_IPV_LOB_PROG_PROV_MO_METRIC_TRNS(
    AARP_ORG_ID   int    NOT NULL, 
    LOB_ID    int    NOT NULL, 
    PGM_CAT_ID   int    NOT NULL, 
    PGM_ID    int    NOT NULL, 
    PROV_ID    int    NOT NULL, 
    CAT_OF_MEAS_ID  int    NOT NULL, 
    SUBCAT_OF_MEAS_ID  int    NOT NULL, 
    MEAS_ID    int    NOT NULL, 
    TYPE_OF_METRIC_ID  int    NOT NULL, 
    METRIC_VAL_ROLE_ID int    NOT NULL, 
    MO_ID     int    NOT NULL, 
    OPER_TXT    varchar(5)  NULL, 
    METRIC_VAL   decimal(19, 2) NOT NULL, 
    LST_UPD_DT   datetime   NOT NULL, 
    LOAD_DT    datetime   NULL, 
    LST_UPD_USERID  char(20)   NOT NULL, 
    CONSTRAINT PK79 PRIMARY KEY NONCLUSTERED (TYPE_OF_METRIC_ID, METRIC_VAL_ROLE_ID, AARP_ORG_ID, LOB_ID, PGM_CAT_ID, PGM_ID, PROV_ID, MEAS_ID, MO_ID, CAT_OF_MEAS_ID, SUBCAT_OF_MEAS_ID), 
    CONSTRAINT RefI_IPV_TYPE_OF_METRIC_TRNS73 FOREIGN KEY (TYPE_OF_METRIC_ID) 
    REFERENCES I_IPV_TYPE_OF_METRIC_TRNS(TYPE_OF_METRIC_ID), 
    CONSTRAINT RefI_IPV_METRIC_VAL_ROLE_TRNS75 FOREIGN KEY (METRIC_VAL_ROLE_ID) 
    REFERENCES I_IPV_METRIC_VAL_ROLE_TRNS(METRIC_VAL_ROLE_ID), 
    CONSTRAINT RefI_IPV_LOB_PROG_PROV_MEAS_TRNS345 FOREIGN KEY (AARP_ORG_ID,LOB_ID,PGM_CAT_ID,PGM_ID,PROV_ID,MEAS_ID,CAT_OF_MEAS_ID,SUBCAT_OF_MEAS_ID) 
    REFERENCES I_IPV_LOB_PROG_PROV_MEAS_TRNS(AARP_ORG_ID,LOB_ID,PGM_CAT_ID,PGM_ID,PROV_ID,MEAS_ID,CAT_OF_MEAS_ID,SUB_CAT_OF_MEAS_ID) 
) 
go 

父表DDL

CREATE TABLE I_IPV_LOB_PROG_PROV_MEAS_TRNS(
    AARP_ORG_ID   int   NOT NULL, 
    LOB_ID    int   NOT NULL, 
    PGM_CAT_ID   int   NOT NULL, 
    PGM_ID    int   NOT NULL, 
    PROV_ID    int   NOT NULL, 
    CAT_OF_MEAS_ID  int   NOT NULL, 
    SUBCAT_OF_MEAS_ID int   NOT NULL, 
    MEAS_ID    int   NOT NULL, 
    LOAD_DT    datetime NULL, 
    LST_UPD_USERID  char(20) NOT NULL, 
    LST_UPD_DT   datetime NOT NULL, 
    CONSTRAINT PK115 PRIMARY KEY NONCLUSTERED (MEAS_ID, PROV_ID, AARP_ORG_ID, LOB_ID, PGM_ID, PGM_CAT_ID, CAT_OF_MEAS_ID, SUBCAT_OF_MEAS_ID), 
    CONSTRAINT RefI_IPV_LOB_PROG_CAT_PROV_TRNS322 FOREIGN KEY (PROV_ID, AARP_ORG_ID, LOB_ID, PGM_ID, PGM_CAT_ID) 
    REFERENCES I_IPV_LOB_PROG_CAT_PROV_TRNS(PROV_ID, AARP_ORG_ID, LOB_ID, PGM_ID, PGM_CAT_ID), 
    CONSTRAINT RefI_IPV_MEAS_CAT_TRNS342 FOREIGN KEY (MEAS_ID, CAT_OF_MEAS_ID, SUBCAT_OF_MEAS_ID) 
    REFERENCES I_IPV_MEAS_CAT_TRNS(MEAS_ID, CAT_OF_MEAS_ID, SUBCAT_OF_MEAS_ID) 
) 
go 

錯誤消息

消息1776,級別16,狀態0,第1行
引用表'I_IPV_LOB_PROG_PROV_MEAS_TRNS'中沒有與外鍵'RefI_IPV_LOB_PROG_PROV_MEAS_TRNS345'中的引用列表匹配的主鍵或候選鍵。
消息1750,級別16,狀態0,行1
無法創建約束。查看以前的錯誤。

+0

你應該添加引起錯誤的引用表的DDL –

+1

那麼這個錯誤真的已經說明了一切:你的外鍵'...._ TRNS345'使用了一列列** **匹配目標表上的任何主鍵或唯一約束。最有可能的是,你的列清單只是一個或某個東西。附註:由** 8列*(!!!!!)組成的PK確實是一個糟糕的主意,需要付出巨大的痛苦。你不能使用一個**單一的,代理**列作爲你的PK? –

回答

0

目標表中的一個字段必須是其主鍵(最好),或者通過某個索引使用至少一個列出的字段非常快地找到。如果列表中沒有鍵,它將不得不讀取整個表來查找特定行,這不是一件好事,所以它不會。 在包含您約束的部分/全部字段的目標表上創建一個唯一索引,並且應該是可以的。