【问题标题】:Oracle - ORA-02270 : no matching unique or primary key for this column-list errorOracle - ORA-02270:此列列表错误没有匹配的唯一键或主键
【发布时间】:2021-12-05 00:07:22
【问题描述】:

我有这两张桌子:

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 : no matching unique key or primary key for this column-list 错误 真诚地,我无法解决问题。有人可以帮助我吗?谢谢

TT

【问题讨论】:

  • 显然有错误但是你能说出你在外键背后的意图吗?
  • 这也是我想问的。如果你解释一下表格,也许它会有所帮助。 TBL2 看起来像一个产品表,但产品代码不是主键。相反,只要它们位于不同的类别 (PRODCATEG) 和不同的 DATERIF 中,您就可以为不同的产品使用相同的产品代码。什么是 DATERIF? TBL1 代表什么?为什么 DATACODE 既可以是 PRODUCTTYPE 也可以是 CODESECTION(您尝试的外键)?这看起来很奇怪。我有一种不好的感觉,你可能真的想要一个与你目前拥有的完全不同的数据模型。
  • @Thorsten Kettner,看起来主键有不同的用途,我不确定这两个外键,但无论如何只要考虑到错误提供了可供 OP 澄清的答案。跨度>
  • 情况正是如此:主键有不同的用途,因为 TBL1 是域表: PRODUCTTYPE 可以为 exple: 'motorcycle','cars' ,CODSECTION 可以是 '4 trokes' 或 ' 2 trokes' ...如果我想保存在 TBL2 中,'motorcycle' 和 '4 trokes' 必须在 TBL1.DATACODE 中。

标签: oracle foreign-keys


【解决方案1】:

注意:OP 需要澄清

您面临的问题是由于foreign key aka referential integrity 的限制,

正如官方文档所说,here

外键约束

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

假设我们在您的代码中看到的 primary key 具有不同的用途,并且您希望在 PRODUCTTYPECODESECTION 列中具有值,以便与 DATACODE 中的值进行检查以实现一些完整性,您需要在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)
);

【讨论】:

  • 我听从了你的建议,而且效果很好。谢谢
【解决方案2】:
  • TBL1 的主键在 DATERIF, DOMAINCODE, DATACODE
  • 如果您想从TBL2 引用TBL1TBL2 的外键约束必须与这些列匹配(不是在名称上,而是在数据类型和顺序上)
  • 目前,您仅通过 DATACODE 列引用它(请参阅这两个 FKs)

如何解决?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    • 2022-12-14
    • 1970-01-01
    相关资源
    最近更新 更多