Oracle-ORA-02270:此列列表错误没有匹配的唯一键或主键

问题描述

我有两个表:

CREATE TABLE TBL1 (
  DATERIF DATE NOT NULL,DOMAINCODE VARCHAR2(20) NOT NULL,DATACODE VARCHAR2(10) NOT NULL,DSDATO VARCHAR2(50),CDDWH CHAR(1),CONSTRAINT PK_TBL1 PRIMARY KEY (DATERIF,DOMAINCODE,DATACODE)
)
;

CREATE TABLE TBL2 (
  DATERIF DATE NOT NULL,PRODUCTCODE CHAR(5 BYTE) NOT NULL,PRODCATEG VARCHAR2(20) NOT NULL,PRODUCTDESCR VARCHAR2(100),PRODUCTTYPE VARCHAR2(10),CODSECTION  VARCHAR2(10),CDDWH CHAR(1 BYTE),DTUPDATED DATE,CONSTRAINT PK_TBL2 PRIMARY KEY (DATERIF,PRODUCTCODE,PRODCATEG),CONSTRAINT FK_TBL2_TBL1_PRODUCTTYPE FOREIGN KEY (PRODUCTTYPE) REFERENCES TBL1(DATACODE),CONSTRAINT FK_TBL2_TBL1_CODSECTION FOREIGN KEY (CODSECTION) REFERENCES TBL1(DATACODE)
)
;

在创建表TBL2时,我得到ORA-02270:此列列表错误没有匹配的唯一键或主键 真诚的,我无法解决问题。有人可以帮我吗?谢谢

TT

解决方法

  • TBL1的主键位于DATERIF,DOMAINCODE,DATACODE
  • 如果您要引用TBL1中的TBL2,则TBL2的外键约束必须与这些列匹配(不是名称,而是数据类型和订单)
  • 当前,您仅通过DATACODE列引用它(请参阅这两个FK

如何解决?

  • 您不能这样做,因为TBL2不包含DOMAINCODE列(尽管它确实包含DATERIFDATACODE,但这还不够)
  • 如果可以的话,你可以
    • DOMAINCODE添加到了TBL2,或者
    • TBL1的主键更改为例如仅DATERIF,DATACODE
    • 将当前主键替换为其他东西(例如序列号)
,

注意:需要从OP中进行澄清

您面临的问题是由于foreign keyreferential integrity的限制,

如官方文档所述,here

外键约束

外键约束(也称为参照完整性约束)将一列指定为外键,并在该外键与指定的主键或唯一键(称为参考键)之间建立关系。组合外键将列的组合指定为外键。

假设我们在您的代码中看到的primary key具有不同的用途,并且您想在PRODUCTTYPECODESECTION列中有值要与{{1}中的值进行比较}为了实现某些完整性,您需要在DATACODE列上创建一个unique约束,然后对它进行DATACODE引用,

foreign key