也许我精疲力尽,但我不明白这一点。我在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);
答案 0 :(得分:1)
由外键(此处为tbl_x
)引用的表必须具有主键或唯一约束。
在用例中,当您在cod_op
上声明唯一索引时,只需将cod_op
设为tbl_x
的主键即可:这将使错误消失。 / p>
通常,在任何表上都有一个主键是一个好习惯。扩展将唯一索引转换为主键的原则,您的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)
);
答案 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;