Можно ли значение по умолчанию для одного столбца быть другим столбцом?
Есть таблица 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 шт):
Нет. Значение по умолчанию может быть или литералом, или (в общем случае) детерминированой функцией, то есть, результат котор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
Нет, значение по-умолчанию для столбца не может быть значением другого столбца.
Можно конечно воспользоваться триггером для присвоения столбцу с 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