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

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

我有这两个表:

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

在创建 Table TBL2 时,我得到 ORA-02270 : no matching unique or primary key for this column-list 错误 真诚地,我无法解决问题。有人可以帮我吗?谢谢

TT

  • TBL1 的主键在 DATERIF, DOMAINCODE, DATACODE
  • 如果您想从 TBL2 引用 TBL1TBL2 的外键约束 必须 匹配那些列(不在名称中, 但在数据类型和顺序中)
  • 目前,您仅通过 DATACODE 列引用它(参见那两个 FK

如何解决?

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

注意:需要 OP

澄清

您遇到的问题是因为 foreign keyreferential integrity

的限制

正如官方文档所说,here

外键约束

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.

假设我们在您的代码中看到的 primary key 具有不同的用途,并且您希望 PRODUCTTYPECODESECTION 列中的值与 [= 中的值进行检查16=] 为了实现一些完整性,您需要在 DATACODE 列上创建一个 unique 约束,然后 foreign key 引用它,

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