alter table report add favourite_film VARCHAR2(100) DEFAULT 'Star Wars';
这会添加一个具有默认值的新列,但在我看来它还会在所有预先存在的行上设置默认值,而不是将它们保留为null,这是我的首选。为方便起见,我们要添加一个带有默认值的新列,但添加此列之前的行应该为空值。
有没有更好的方法来做到这一点,而不是在添加新列后立即将所有行的值设置为null
?
答案 0 :(得分:4)
尝试做类似的事情:
SQL> create table testtab
(
id number,
col1 varchar2(10)
)
Table created.
SQL> insert into testtab(id, col1) values (1,'TEST1')
1 row created.
SQL> insert into testtab(id, col1) values (2,'TEST2')
1 row created.
SQL> commit
Commit complete.
SQL> alter table testtab add col2 varchar2(10)
Table altered.
SQL> alter table testtab modify col2 default 'DEFAULT'
Table altered.
SQL> select * from testtab
ID COL1 COL2
---------- ---------- ----------
1 TEST1
2 TEST2
2 rows selected.
SQL> insert into testtab(id, col1) values (3,'TEST3')
1 row created.
SQL> select * from testtab
ID COL1 COL2
---------- ---------- ----------
1 TEST1
2 TEST2
3 TEST3 DEFAULT
3 rows selected.
请注意,根据Oracle docs,如果使用alter table命令的add column子句,它会将指定的默认值添加到现有行:
如果为可为空的列指定DEFAULT子句,则为 默认值作为此ALTER TABLE的一部分添加到现有行 语句,以及在表上定义的任何更新触发器都会被触发。 如果使用a更改NOT NULL列,也会导致此行为 默认值可以为空。