2

我有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

如何添加第四外键T_CAMPAGNE_SMS_EXECUTIONCLE_PARTITION

我已经试过这样:

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

,但我仍然得到相同的错误信息。

+0

我们不能告诉您如何更改此代码,除非您告诉我们CK和FK实际是什么。因此,找出这些术语/声明的含义并在您的设计中找到它们。然后告诉我们。 (请参阅我的回答。) – philipxy

+0

您可以使用数据模型打印屏幕推断出这一点。不需要代码。 – JulHaus

+0

@JulHaus推导出什么? – philipxy

回答

0

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

将另一列在您的T_CAMPAGNE_SMS_EXECUTION带有名称CLE_LOT_REPARTITION第二PK列

之后,改变你的外键约束,像这样:

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"); 
+0

感谢,但我得到这个错误,而不是:ERREURcommençant点菜LIGNE:20德拉COMMANDE - ALTER TABLE “T_CAMPAGNE_SMS_EXECUTION” 添加约束FK_REPARTITION外键( “CLE_REPARTITION”, “CLE_LOT_REPARTITION”)引用 “T_CAMPAGNE_SMS_REPARTITION”( “CLE_REPARTITION” “CLE_LOT_REPARTITION”) 融洽D'ERREUR - ERREUR SQL:ORA-00904: “CLE_LOT_REPARTITION”:identificateur非的Valide 00904. 00000 - “%s的:无效的标识符” *原因: *操作: – user609511

+0

你加列CLE_LOT_REPARTITION到T_CAMPAGNE_SMS_EXECUTION? – ggradnig

+0

不,我不能这样做,因为当我这样做时,它并不适合业务逻辑......我想我必须做出全面的解决方案......我会使列独一无二......谢谢 – user609511

1

如果你不希望添加在T_CAMPAGNE_SMS_EXECUTION中,然后在T_CAMPAGNE_SMS_REPARTITION上创建一个技术主键。像T_CAMPAGNE_SMS_REPARTITION_ID这是一个简单的数字链接到一个序列(或一个IDENTITY列,如果你有一个Oracle 12,请参阅文档https://oracle-base.com/articles/12c/identity-columns-in-oracle-12cr1)。

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

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

希望这有助于

+0

给定的代码不一致。我们不知道哪部分是错的。所以我们不知道什么是对的。 – philipxy

0

表有一个或多个CKs (candidate keys):不包含更小的唯一列集独特的列集。至多一个CK可以通过PRIMARY KEY在每个表中声明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而不是两列PK。也许只是(CLE_REPARTITION)是CK/PK。也许你想要一个复合SQL FK而不是1列。也许你希望T_CAMPAGNE_SMS_REPARTITION(CLE_REPARTITION)子行成为T_CAMPAGNE_SMS_EXECUTION(CLE_REPARTITION)子行,尽管它们在那里不是唯一的。这不是FK。这是一个IND(包含依赖)。它需要一个触发器来执行。

这些约束条件取决于行在商业情况下在表中的行数,以及给定业务规则时可能出现的情况/状态。确切地确定你的表上的约束是什么,并按照上面的方式声明它们。