按照你的描述,“父子”关系是假的。您应该在数据库中做到这一点,而不是在纸上(或在您的想法中)。
因为,如果它们真的是父子表,就会有一个参照完整性约束,不允许您输入无效值(即子表不可能有父子表中不存在的 linenr 值表)。
应该是这样的:
SQL> create table invoice
2 (linenr number constraint pk_inv primary key,
3 whatever varchar2(10)
4 );
Table created.
SQL> create table invoiceline
2 (id_invline number constraint pk_invline primary key,
3 linenr number constraint fk_invline_inv references invoice(linenr),
4 whatever varchar2(2)
5 );
Table created.
SQL>
我推测linenr 列做了外键约束。
或者,可能是复合主键(然后是外键):
SQL> create table invoice
2 (id_inv number,
3 linenr number,
4 whatever varchar2(10),
5 --
6 constraint pk_inv primary key (id_inv, linenr)
7 );
Table created.
SQL> create table invoiceline
2 (id_invline number constraint pk_invline primary key,
3 id_inv number,
4 linenr number,
5 whatever varchar2(2),
6 --
7 constraint fk_invline_inv foreign key (id_inv, linenr)
8 references invoice (id_inv, linenr)
9 );
Table created.
SQL>
现在该怎么办?谁知道?您如何知道将哪些行更改为哪些值?也许使用update 声明如下:
update invoiceline b set
b.linenr = (select a.linenr
from invoice a
where a.id_inv = b.id_inv
)
where exists (select null
from invoice c
where c.id_inv = b.id_inv
);
如果你想知道“为什么是exists?”,答案是:因为那种假父子关系。不能保证每个子行都有其父行,因此要避免为没有父行的行将 linenr 设置为 NULL。