Set ORACLE table fields default value to a formula

2019-02-19 10:16发布

I have an oracle table like this:

create table tms_transaction_tbl
(
trans_id number primary key,
location_id number,
trans_date date,
resource_id number,
ts_id number,
max_value number,
booked_units number default 0,
remaining number default (select max_value-booked_units),
booked number not null ,
user_id number,
trans_time timestamp
);

as you can see I tried to set default value of remaining to (max_value-booked_units)

remainging number default (select max_value-booked_units),

but it gives me this error this error

ora-22818:subquery expression not allowed here

2条回答
时光不老,我们不散
2楼-- · 2019-02-19 10:40

You cannot refer to other columns in the DEFAULT expression

Here is the snippet from Oracle Documentation

Restriction on Default Column Values A DEFAULT expression cannot contain references to PL/SQL functions or to other columns, the pseudocolumns CURRVAL, NEXTVAL, LEVEL, PRIOR, and ROWNUM, or date constants that are not fully specified.

查看更多
霸刀☆藐视天下
3楼-- · 2019-02-19 11:00

You can't use a SELECT as a default value, it must be a constant.

If you're using Oracle 11g this is what virtual columns are for. You can't insert into or update them but the provide a pre-calculated column in the database for you.

create table tms_transaction_tbl
 ( trans_id number primary key,
   location_id number,
   trans_date date,
   resource_id number,
   ts_id number,
   max_value number,
   booked_units number default 0,
   remaining number generated always as ( max_value - booked_units ) virtual,
   booked number not null ,
   user_id number,
   trans_time timestamp
   );

The syntax is further described in the documentation for the CREATE TABLE statement. If you're not using 11g you can achieve the same logic with a view on top of your table.

If you don't want to use a view or a virtual column then I can only recommend that you do not store this data at all.

查看更多
登录 后发表回答