我正在尝试在两个表之间创建外键,但得到:ORA-02270

时间:2019-09-09 20:47:50

标签: oracle foreign-keys constraints ddl

也许我精疲力尽,但我不明白这一点。我在Oracle中有两个表:TBL_a和TBL_x。我正在尝试在两个表之间创建一个外键,如下所示,并得到错误

  

ORA-02270:没有匹配的唯一键或主键。

CREATE TABLE tbl_a (
    cod_op integer, 
    cod_dni char(8), 
    cod_correl integer, 
     varchar2(50)
);

CREATE TABLE tbl_x (
    cod_op integer, 
    cod_dni char(8), 
    blabla varchar2(50)
);

CREATE UNIQUE INDEX TBL_A_PK ON TBL_A (COD_OP);
CREATE UNIQUE INDEX TBL_x_PK ON TBL_x (COD_OP);

ALTER TABLE TBL_a ADD CONSTRAINT TBL_a_R01 
    FOREIGN KEY (COD_OP) REFERENCES TBL_x (COD_OP);

2 个答案:

答案 0 :(得分:1)

由外键(此处为tbl_x)引用的表必须具有主键或唯一约束。

在用例中,当您在cod_op上声明唯一索引时,只需将cod_op设为tbl_x的主键即可:这将使错误消失。 / p>

Demo on DB Fiddle

通常,在任何表上都有一个主键是一个好习惯。扩展将唯一索引转换为主键的原则,您的DDL语句可以简化如下:

CREATE TABLE tbl_x (
    cod_op INTEGER PRIMARY KEY, 
    cod_dni CHAR(8), 
    blabla VARCHAR2(50)
);

CREATE TABLE tbl_a (
    cod_op INTEGER PRIMARY KEY, 
    cod_dni CHAR(8), 
    cod_correl INTEGER, 
    blabla VARCHAR2(50),
    CONSTRAINT TBL_a_R01 FOREIGN KEY (COD_OP) REFERENCES TBL_x (COD_OP)
);

Demo on DB Fiddle

答案 1 :(得分:1)

问题是您在表上创建了唯一的INDEXES,但没有创建唯一或主键CONSTRAINT。 Oracle要求存在约束条件才能建立外键关系。

如果删除现有索引并添加适当的约束,则可以建立外键关系:

DROP INDEX TBL_A_PK;

DROP INDEX TBL_x_PK;

ALTER TABLE TBL_A
  ADD CONSTRAINT UQ_A
    UNIQUE(COD_OP)
    USING INDEX;

ALTER TABLE TBL_X
  ADD CONSTRAINT UQ_X
    UNIQUE(COD_OP)
    USING INDEX;

dbfiddle here