Изменение свойства таблицы на значение по умолчанию, когда NULL только для новых вставок - PullRequest
0 голосов
/ 30 ноября 2018

Есть ли способ в Oracle, чтобы мы могли установить значение столбца по умолчанию, когда NULL только для новых вставок?Я не хочу изменять существующие записи, если они имеют NULL.

Я хочу сделать это на уровне таблицы.Не с логикой вставки NVL.

Ответы [ 3 ]

0 голосов
/ 30 ноября 2018

Вот демонстрация, которая показывает, что происходит.

Сначала тестовая таблица и некоторые вставки:

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 (я знаю, вы не - простоскажем, для дальнейшего использования), есть еще один вариант: DEFAULT ON 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

Упс!Не будет работать, если в столбце есть NULL.Я знаю # 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.

OK;давайте посмотрим, как он себя ведет: я явно вставляю NULL в столбец.В предыдущем примере он не поместил туда «какое-то значение», а оставил значение 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

Хорошо;у нас есть «некоторое значение» в столбце.


Теперь у вас есть больше информации о проблеме;посмотрим, поможет ли это.

0 голосов
/ 01 декабря 2018

Как упоминал Littlefoot, Если вы явно поместите NULL в столбец, он не получит значение по умолчанию .

Если для столбца в запросе вставки не указано значение, используется DEFAULT.Но явное NULL переопределяет выражение по умолчанию.

Для 12c и выше вы можете использовать опцию DEFAULT ON NULL.Для предыдущих версий единственный способ, насколько я могу судить, - реплицировать эту функциональность через TRIGGER

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;

Table YOURTABLE created.


Trigger TRG_MOD_YOURTABCOL compiled


1 row inserted.


YOURCOLUMN                                                                                          
----------------------------------------------------------------------------------------------------
SOME DEFAULT VALUE

1 row selected. 
0 голосов
/ 30 ноября 2018

Насколько я знаю, если вы измените таблицу и установите значение по умолчанию для столбца, это должно повлиять только на новые записи, которые поступят через вставку, а не на существующие записи.

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

Используя вышеупомянутый подход, col значения, которые уже NULL, должны оставаться NULL, по крайней мере, с точки зрения вставок, не изменяющих эти NULL значения.И вновь вставленные записи, которые не указывают значение для col, должны получить значение по умолчанию some value.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...