SQL 更新使用旧列值

rlo*_*ang 12 sql oracle oracle19c

鉴于这张表

create table FOO
(
    ID number(19) primary key,
    DATE1 DATE default sysdate,
    DATE2 DATE
);
Run Code Online (Sandbox Code Playgroud)

当我插入一行时,DATE1 用 sysdate 初始化,然后设置为 null,然后复制到 DATE2:

insert into FOO (ID) VALUES (1);
update FOO set DATE1 = null where id = 1;
update FOO set DATE2 = DATE1 where id = 1;
select DATE2 from FOO;
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,DATE2 最终为空。

但是如果我分两步创建表:

create table FOO
(
    ID number(19) primary key
);
alter table FOO
    add DATE1 DATE default sysdate
    add DATE2 DATE;
Run Code Online (Sandbox Code Playgroud)

并运行相同的插入和更新,DATE2 最终成为 DATE1 的原始 sysdate 值。即使 DATE1 按预期最终为空。

为什么会有这样的差异?这两张桌子对我来说看起来是一样的。

更新:在这两种情况下描述都是这样的:

SQL> describe foo
 Name                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                    NOT NULL NUMBER(19)
 DATE1                          DATE
 DATE2                          DATE

Run Code Online (Sandbox Code Playgroud)