Search code examples
oracleforeign-keys

Oracle - ORA-02270 : no matching unique or primary key for this column-list error


I have this two tables:

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)
)
;

and

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)
)
;

on the Table TBL2 creation, I get ORA-02270 : no matching unique or primary key for this column-list error Sincerely, I can't solve the problem. Could someone help me? Thank you

TT


Solution

  • Note:Clarification required from OP

    The problem you are facing is because of the restriction on foreign key aka referential integrity,

    As the official doc says, here

    Foreign Key Constraints

    A foreign key constraint (also called a referential integrity constraint) designates a column as the foreign key and establishes a relationship between that foreign key and a specified primary or unique key, called the referenced key. A composite foreign key designates a combination of columns as the foreign key.

    Having assumption that both the primary key we see in your code has different purpose and you want to have value in PRODUCTTYPE and CODESECTION column to be checked against value in DATACODE as to fulfill some integrity, you need to create an unique constraint on the DATACODE column and then the foreign key reference to it,

    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),
      CONSTRAINT UK_DATACODE_TBL1 UNIQUE(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)
    );