Можно ли значение по умолчанию для одного столбца быть другим столбцом?

Есть таблица product. Если в столбце description не введено значения, то хотел бы, чтобы оно по умолчанию было равно значению в столбце product_name.

То есть, что то подобное:

CONSTRAINT def_desc DEFAULT product.product_name FOR description;

Но это конечно не работает.

Возможно ли вообще это?


Свободный перевод вопроса Can the default value of one column be another column in SQL? от участника @uckocaman


Ответы (2 шт):

Автор решения: 0xdb

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

Логической проблемой при использовании другого столбца - что должно стать значением при изменении столбца, на который делается ссылка. Если, допустим, так будет работать:

create table t (
     x int, y int default x);
    
insert into t (x) values (1);

update t set x = 2;

Что теперь ожидается в столбце y, значение 1 or 2?

Если надо, чтобы y было 2, то можно воспользоваться виртуальным столбцом с вычисляемым значением.


Свободный перевод ответа от участника Gordon Linoff

→ Ссылка
Автор решения: 0xdb

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

Можно конечно воспользоваться триггером для присвоения столбцу с NULL значения другого столбца, но гораздо проще и лучше будет решение - объявить столбец как NOT NULL, и тем самым принудить при вставке задавать значение "по-умолчанию" явно.

Вот так:

create table product (name varchar2 (8), description varchar2 (32) not null);

insert into product (name) values ('product1');
ORA-01400: cannot insert NULL into ("DB"."PRODUCT"."DESCRIPTION")

declare 
    name product.name%type := 'product1';
    description product.description%type;
begin 
    insert into product values (name, coalesce (description, name));
end;
/
select * from product
/
NAME     DESCRIPTION                     
-------- --------------------------------
product1 product1                        
→ Ссылка