如何将外键添加到复合主键

时间:2017-07-28 12:50:49

标签: oracle foreign-keys primary-key composite-primary-key composite-key

我有2张桌子: T_CAMPAGNE_SMS_REPARTITIONT_CAMPAGNE_SMS_EXECUTION

T_CAMPAGNE_SMS_REPARTITION中有2个主键。

enter image description here

T_CAMPAGNE_SMS_EXECUTION中,有1个主键和4个外键。

enter image description here

如何添加CLE_PARTITION的第4个外键T_CAMPAGNE_SMS_EXECUTION

我试过这个:

ALTER TABLE "T_CAMPAGNE_SMS_EXECUTION"
    add constraint FK_REPARTITION foreign key("CLE_REPARTITION")
    references "T_CAMPAGNE_SMS_REPARTITION"("CLE_REPARTITION");

但是我收到了这个错误:

Erreur commençant à la ligne: 10 de la commande -
ALTER TABLE "T_CAMPAGNE_SMS_EXECUTION" 
  add constraint FK_REPARTITION foreign key("CLE_REPARTITION") references "T_CAMPAGNE_SMS_REPARTITION"("CLE_REPARTITION")
Rapport d'erreur -
Erreur SQL : ORA-02270: pas de correspondance de clé primaire ou unique pour cette liste de colonnes
02270. 00000 -  "no matching unique or primary key for this column-list"
*Cause:    A REFERENCES clause in a CREATE/ALTER TABLE statement
           gives a column-list for which there is no matching unique or primary
           key constraint in the referenced table.
*Action:   Find the correct column names using the ALL_CONS_COLUMNS
           catalog view

我尝试过这样的设计:

enter image description here

但我仍然收到相同的错误消息。

3 个答案:

答案 0 :(得分:1)

如果您不想在T_CAMPAGNE_SMS_EXECUTION中添加列,请在T_CAMPAGNE_SMS_REPARTITION上创建技术主键。类似于T_CAMPAGNE_SMS_REPARTITION_ID的东西,它是一个链接到序列的简单数字(如果您有Oracle 12,则为IDENTITY列,请参阅此处的文档https://oracle-base.com/articles/12c/identity-columns-in-oracle-12cr1)。

将主键约束更改为T_CAMPAGNE_SMS_REPARTITION上的唯一约束以保持行为,并在T_CAMPAGNE_SMS_EXECUTION中创建一个新列以链接到新创建的列。

问题是你不能仅引用复合PK的一部分,因为你无法确定它是唯一的。

希望这有帮助

答案 1 :(得分:0)

您有一个由两列组成的复合主键,但在您的FOREIGN KEY中,您只引用这两列中的一列。

在T_CAMPAGNE_SMS_EXECUTION中为第二个PK列添加另一列,名称为CLE_LOT_REPARTITION

之后,更改您的FOREIGN KEY约束,如下所示:

ALTER TABLE "T_CAMPAGNE_SMS_EXECUTION" 
  add constraint FK_REPARTITION foreign key("CLE_REPARTITION", "CLE_LOT_REPARTITION") references "T_CAMPAGNE_SMS_REPARTITION"("CLE_REPARTITION", "CLE_LOT_REPARTITION");

答案 2 :(得分:0)

表格包含一个或多个CKs (candidate keys):唯一列集,不包含较小的唯一列集。每个表最多可以通过PRIMARY KEY将一个CK声明为PK(主键);通过UNIQUE NOT NULL声明其他人。

你有一个PK,有两列。拥有多个列,它是复合的。

SQL FOREIGN KEY是列的列表,其值在其他位置显示为SQL PRIMARY KEY或UNIQUE NOT NULL。并且引用的列表必须声明唯一,即使它包含另一个声明的唯一列集。您引用的列表(CLE_REPARTITION)未声明为唯一。所以与错误消息完全相同there is no matching unique or primary key constraint in the referenced table

也许你想要两个单列非复合PK而不是2列PK。也许只是(CLE_REPARTITION)是CK / PK。也许你想要一个复合SQL FK而不是1列的。也许您希望T_CAMPAGNE_SMS_REPARTITION(CLE_REPARTITION)子行为T_CAMPAGNE_SMS_EXECUTION(CLE_REPARTITION)子行,即使它们在那里不是唯一的。那不是FK。这是一个IND(包含依赖)。它需要一个触发器来强制执行。

这些约束由行在业务情境中的表中所说的内容以及业务规则可能出现的情况/状态决定。确切地确定表上的约束是什么,并在上面声明它们。