Oracle 将表属性更改为默认值(仅在新插入时为NULL)

Oracle 将表属性更改为默认值(仅在新插入时为NULL),oracle,oracle11g,Oracle,Oracle11g,在Oracle中,是否有任何方法可以将默认列值设置为空,仅用于新插入?如果现有记录为空,我不想更改它们 我想在桌上做这个。不使用NVL插入逻辑 据我所知,如果更改表并为列设置默认值,则只会影响通过insert输入的新记录,而不会影响现有记录 ALTER TABLE yourTable MODIFY (col VARCHAR(100) DEFAULT 'some value'); 使用上述方法,col已经为NULL的值应保持为NULL,至少从插入不改变那些NULL值的角度来看是如此。而新插入的记

在Oracle中,是否有任何方法可以将默认列值设置为空,仅用于新插入?如果现有记录为空,我不想更改它们


我想在桌上做这个。不使用NVL插入逻辑

据我所知,如果更改表并为列设置默认值,则只会影响通过insert输入的新记录,而不会影响现有记录

ALTER TABLE yourTable MODIFY (col VARCHAR(100) DEFAULT 'some value');

使用上述方法,
col
已经为
NULL
的值应保持为
NULL
,至少从插入不改变那些
NULL
值的角度来看是如此。而新插入的记录如果没有为
col
指定值,则应接收默认值
some value

。据我所知,如果更改表并为列设置默认值,则只会影响通过插入而来的新记录,而不会影响现有记录

ALTER TABLE yourTable MODIFY (col VARCHAR(100) DEFAULT 'some value');

使用上述方法,
col
已经为
NULL
的值应保持为
NULL
,至少从插入不改变那些
NULL
值的角度来看是如此。新插入的记录如果没有为
列指定值
,则应接收默认值
某些值

。下面是一个演示,演示了发生的情况

首先,测试表和一些插入:

SQL> create table test (id number, col varchar2(10));

Table created.

SQL> insert into test (id, col) values (1, null);

1 row created.

SQL> insert into test (id, col) values (2, 'Littlefoot');

1 row created.

SQL> select * from test;

        ID COL
---------- ----------
         1
         2 Littlefoot
更改表格,使新添加的行包含COL列的“某些值”:

SQL> alter table test modify col default 'some value';

Table altered.
嗯,;现在,故事的重要部分是:注意以下几点:

SQL> -- this won't work as you wanted, because I explicitly inserted NULL into COL
SQL> insert into test (id, col) values (3, null);

1 row created.

SQL> -- this will work, because COL is omitted from the INSERT statement
SQL> insert into test (id) values (4);

1 row created.

SQL> select * From test;

        ID COL
---------- ----------
         1
         2 Littlefoot
         3
         4 some value

SQL>
看到了吗?如果在列中显式地输入NULL,它将不会得到默认值


然而,如果您使用的是12c(我知道,您不只是说,供将来参考),还有另一个选项:
默认为NULL
。事情是这样的:

SQL> alter table test modify col default on null 'some value';
alter table test modify col default on null 'some value'
*
ERROR at line 1:
ORA-02296: cannot enable (SCOTT.) - null values found
哎呀!如果列中有空值,则此选项无效。我知道#2您不想修改现有行,但是-对于本演示,我将这样做:

SQL> update test set col = 'x' where col is null;

2 rows updated.

SQL> alter table test modify col default on null 'some value';

Table altered.
嗯,;让我们看看它的行为:我显式地在列中插入NULL。在前面的示例中,它没有在其中放入“some value”,而是将其保留为NULL。现在呢

SQL> insert into test (id, col) values (5, null);

1 row created.

SQL> select * From test;

        ID COL
---------- ----------
         1 x
         2 Littlefoot
         3 x
         4 some value
         5 some value
不错;我们在列中有“一些价值”



现在你有了更多关于这个问题的信息;看看是否有帮助。

这里有一个演示,展示了正在发生的事情

首先,测试表和一些插入:

SQL> create table test (id number, col varchar2(10));

Table created.

SQL> insert into test (id, col) values (1, null);

1 row created.

SQL> insert into test (id, col) values (2, 'Littlefoot');

1 row created.

SQL> select * from test;

        ID COL
---------- ----------
         1
         2 Littlefoot
更改表格,使新添加的行包含COL列的“某些值”:

SQL> alter table test modify col default 'some value';

Table altered.
嗯,;现在,故事的重要部分是:注意以下几点:

SQL> -- this won't work as you wanted, because I explicitly inserted NULL into COL
SQL> insert into test (id, col) values (3, null);

1 row created.

SQL> -- this will work, because COL is omitted from the INSERT statement
SQL> insert into test (id) values (4);

1 row created.

SQL> select * From test;

        ID COL
---------- ----------
         1
         2 Littlefoot
         3
         4 some value

SQL>
看到了吗?如果在列中显式地输入NULL,它将不会得到默认值


然而,如果您使用的是12c(我知道,您不只是说,供将来参考),还有另一个选项:
默认为NULL
。事情是这样的:

SQL> alter table test modify col default on null 'some value';
alter table test modify col default on null 'some value'
*
ERROR at line 1:
ORA-02296: cannot enable (SCOTT.) - null values found
哎呀!如果列中有空值,则此选项无效。我知道#2您不想修改现有行,但是-对于本演示,我将这样做:

SQL> update test set col = 'x' where col is null;

2 rows updated.

SQL> alter table test modify col default on null 'some value';

Table altered.
嗯,;让我们看看它的行为:我显式地在列中插入NULL。在前面的示例中,它没有在其中放入“some value”,而是将其保留为NULL。现在呢

SQL> insert into test (id, col) values (5, null);

1 row created.

SQL> select * From test;

        ID COL
---------- ----------
         1 x
         2 Littlefoot
         3 x
         4 some value
         5 some value
不错;我们在列中有“一些价值”


现在你有了更多关于这个问题的信息;看看它是否有用。

正如Littlefoot所提到的,如果您显式地将
NULL
放入一列,它将不会得到默认值

如果在insert查询中未提及该列的值,则使用
DEFAULT
。但是,显式的
NULL
会覆盖默认表达式

对于12c及以上版本,您可以使用默认为空的
选项。
对于以前的版本,据我所知,唯一的方法是通过
触发器复制该功能

CREATE TABLE YOURTABLE (  yourcolumn VARCHAR(100) );


CREATE OR REPLACE TRIGGER trg_mod_yourtabcol BEFORE
     INSERT ON yourtable
     FOR EACH ROW
     WHEN ( new.yourcolumn IS NULL )

BEGIN
     :new.yourcolumn := 'SOME DEFAULT VALUE';
END;
/


INSERT INTO YOURTABLE(yourcolumn) VALUES(NULL);

select * from YOURTABLE;

正如Littlefoot所提到的,如果显式地将
NULL
放入列中,它将不会得到默认值

如果在insert查询中未提及该列的值,则使用
DEFAULT
。但是,显式的
NULL
会覆盖默认表达式

对于12c及以上版本,您可以使用默认为空的
选项。
对于以前的版本,据我所知,唯一的方法是通过
触发器复制该功能

CREATE TABLE YOURTABLE (  yourcolumn VARCHAR(100) );


CREATE OR REPLACE TRIGGER trg_mod_yourtabcol BEFORE
     INSERT ON yourtable
     FOR EACH ROW
     WHEN ( new.yourcolumn IS NULL )

BEGIN
     :new.yourcolumn := 'SOME DEFAULT VALUE';
END;
/


INSERT INTO YOURTABLE(yourcolumn) VALUES(NULL);

select * from YOURTABLE;


你的问题实际上非常类似,但我在下面也给出了答案。你的问题实际上非常类似,但我在下面也给出了答案。我尝试了这个。旧的价值观没有改变。但当我插入空值的新记录时。它将作为NULL插入。它没有得到默认值。我尝试了这个。旧的价值观没有改变。但当我插入空值的新记录时。它将作为NULL插入。它没有得到默认值。