在sql文件中创建一个带外键的表,与下面创建的另一个表连接。

问题描述 投票:0回答:1

我的问题是,我有两个表,每个表都有一个外键到另一个表.每次,我执行包含创建两个表的SQL文件,它给我一个错误,他没有找到另一个表。我使用sqlplus来执行sql文件.下面是我用.NET Framework 2.0试过的一个SQL文件的例子。

create table A(
Age number(3),
name number(3) constraint A_FK references B(name))
/
create table B(
Age number(3) constraint B_FK references A(Age),
name number(3))

即使我把顺序反过来,它也给出了同样的错误.谢谢帮助。

sql oracle foreign-keys sqlplus
1个回答
0
投票

外键所引用的表列必须在创建约束时存在。由于你在表之间有某种循环引用,你需要分三步来做。

  • 首先创建一个没有外键的表

  • 创建第二个表

  • 最后将外键添加到第一个表中,并添加一个 alter table 声明

你还需要引用的列有一个唯一的或主键的约束,否则你会得到错误信息 ORA-02270: no matching unique or primary key for this column-list.

create table A(
    age number(3) primary key,
    name number(3) 
);

create table B(
    age number(3) constraint B_FK references A(Age),
    name number(3) primary key
);

alter table A add constraint A_FK foreign key (name) references B(name);

DB Fiddle上的演示

附注:我对你的样本结构很怀疑,但这可能是因为你在问题中过于简化了。


1
投票

这是一个外键的循环问题。 一种方法是在创建表后添加所有外键(我想其他答案提出的)。

你也可以只对第一个表这样做。

create table A (
    Age number(3) primary key,
    name number(3)
);

create table B (
    name number(3) primary key,
    Age number(3),
    constraint B_FK foreign key (age) references A(Age)
);

alter table B add constraint A_FK foreign key (name) references B(name);

这里 是一种db<>提琴。

注释。

  • 外键应该引用主键,所以我也加上了这个声明。
  • 我建议将主键作为表的第一列。
  • 你也可以为其中的一个表内联定义约束(即? age number(3) constraint b_fk references a(age)).

0
投票

它失败了,因为参考表还不存在。

先创建没有键的表。 然后删除其中一个表,用引用表重新创建。 然后删除第二张表,并用引用重新创建。


0
投票

先创建表,然后在表上添加CONSTRAINT

ALTER TABLE A
ADD FOREIGN KEY (name) REFERENCES B(name);

ALTER TABLE B
ADD FOREIGN KEY (age) REFERENCES A(age);
© www.soinside.com 2019 - 2024. All rights reserved.