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