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

Oracle-ORA-02270:此列列表没有匹配的唯一或主键错误,oracle,foreign-keys,Oracle,Foreign Keys,我有两张桌子: 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) ) ; 及 在创建表TBL2时,我得到OR

我有两张桌子:

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

在创建表TBL2时,我得到ORA-02270:没有匹配此列列表错误的唯一键或主键 老实说,我解决不了这个问题。有人能帮我吗?多谢各位

TT

  • TBL1
    的主键位于
    DATERIF、DOMAINCODE、DATACODE
  • 如果要从
    TBL2
    引用
    TBL1
    TBL2
    的外键约束必须与这些列匹配(不是名称,而是数据类型和顺序)
  • 目前,您仅通过
    DATACODE
    列引用它(请参见这两个
    FK
    s)
如何修复它

  • 您不能这样做,因为
    TBL2
    不包含
    DOMAINCODE
    列(尽管它确实包含
    DATERIF
    DATACODE
    ,但这还不够)
  • 你可以,如果你愿意的话
    • DOMAINCODE
      添加到
      TBL2
      ,或
    • TBL1
      的主键更改为仅限
      DATERIF、DATACODE
    • 将当前主键替换为其他主键(例如序列号)
      • TBL1
        的主键位于
        DATERIF、DOMAINCODE、DATACODE
      • 如果要从
        TBL2
        引用
        TBL1
        TBL2
        的外键约束必须与这些列匹配(不是名称,而是数据类型和顺序)
      • 目前,您仅通过
        DATACODE
        列引用它(请参见这两个
        FK
        s)
      如何修复它

      • 您不能这样做,因为
        TBL2
        不包含
        DOMAINCODE
        列(尽管它确实包含
        DATERIF
        DATACODE
        ,但这还不够)
      • 你可以,如果你愿意的话
        • DOMAINCODE
          添加到
          TBL2
          ,或
        • TBL1
          的主键更改为仅限
          DATERIF、DATACODE
        • 将当前主键替换为其他主键(例如序列号)
        • 注:OP需要澄清

          您面临的问题是对
          外键
          aka
          引用完整性的限制

          正如官方文件所说

          外键约束

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

          假设我们在您的代码中看到的
          主键
          具有不同的用途,并且您希望在
          PRODUCTTYPE
          codesesection
          列中有值,以便与
          DATACODE
          中的值进行检查,以实现某种完整性,您需要在
          DATACODE
          列上创建一个
          unique
          约束,然后创建对它的
          外键
          引用

          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)
          );
          
          注:OP需要澄清

          您面临的问题是对
          外键
          aka
          引用完整性的限制

          正如官方文件所说

          外键约束

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

          假设我们在您的代码中看到的
          主键
          具有不同的用途,并且您希望在
          PRODUCTTYPE
          codesesection
          列中有值,以便与
          DATACODE
          中的值进行检查,以实现某种完整性,您需要在
          DATACODE
          列上创建一个
          unique
          约束,然后创建对它的
          外键
          引用

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

          显然有错误,但是你能告诉我外键背后的意图吗?这也是我想问的。如果你解释一下表格,也许会有帮助。TBL2看起来像一个产品表,但产品代码不是主键。相反,您允许对不同的产品使用相同的产品代码,只要它们属于不同的类别(PRODCATEG)和不同的日期。什么是DATERIF?TBL1代表什么?为什么数据代码既可以是PRODUCTTYPE,也可以是CODSECTION(您尝试的外键)?这看起来很奇怪。我有种不好的感觉,你可能真的想要一个与你目前拥有的完全不同的数据模型。@Thorsten Kettner,看起来主键有不同的用途,我不确定这两个外键,但无论如何,只要考虑到错误,就提供答案,这是开放给OP澄清的。事实就是这样:主键有不同的用途,因为TBL1是一个域表:PRODUCTTYPE可以解释为:“摩托车”、“汽车”,CODSECTION可以是“4次”或“2次”。。。如果我想保存在TBL2中,“motorcycle”和“4Trokes”都必须在TBL1.DATACODE中。显然有错误,但您能告诉我外键背后的意图吗?这也是我想问的。如果你解释一下表格,也许会有帮助。TBL2看起来像一个产品表,但产品代码不是主键。相反,您允许对不同的产品使用相同的产品代码,只要它们属于不同的类别(PRODCATEG)和不同的日期。什么是DATERIF?TBL1代表什么?为什么数据代码既可以是PRODUCTTYPE,也可以是CODSECTION(您尝试的外键)?这看起来很奇怪。我有种不好的感觉,你可能真的想要一个与你目前拥有的完全不同的数据模型。@Thorsten Kettner,