2013-02-19 139 views
2

我有一个Oracle表是这样的:将Oracle设置表字段默认值的公式推

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 
); 

,你可以看到我试图设置剩余(MAX_VALUE-booked_units)

remainging number default (select max_value-booked_units), 
的默认值

但它给我这个错误这个错误

ora-22818:subquery expression not allowed here 
+0

不要以为你能做到这一点。看看使用触发器可能吗? – OldProgrammer 2013-02-19 12:52:39

+0

如果值始终是max_value-booked_units,它是否需要是列?在运行中计算确定性值最好在应用程序中完成(通过选择或嵌入视图内);这避免了触发器(这是一件好事) – Harrison 2013-02-19 13:12:06

回答

2

您不能使用SELECT作为默认值,它必须是常量。

如果您使用Oracle 11g,这是virtual columns的用途。您无法插入或更新它们,但为您提供数据库中的预计算列。

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 
    ); 

语法在CREATE TABLE statement的文档中有进一步的描述。如果你不使用11g,你可以在桌子顶部的视图中实现相同的逻辑。

如果您不想使用视图或虚拟列,然后I can only recommend您根本不存储此数据。

3

您不能引用其他列的DEFAULT expressio Ñ

下面是从Oracle Documentation

上默认列约束值缺省表达式不能 包含对PL/SQL函数或对其他列的引用的片段中, 伪列CURRVAL,NEXTVAL,LEVEL,PRIOR,和ROWNUM,或日期 常量没有完全指定。