2016-12-14 56 views
-1

我有3列正在使用在表中。第一個是可以使用的最大量,第二個是已使用的量。現在,我想讓第三列成爲最大(1st-2nd,0)。帶有最大功能的更新

我使用update my_table set availability = max(1st-2nd,0) where type = 'bill';

但在過程中,這是不可能的。主要的是我不想要負面價值,我想要0而不是它。我怎樣才能做到這一點。

回答

1

使用GREATEST函數:

UPDATE my_table 
    SET availability = GREATEST(1st-2nd,0) 
WHERE type = 'bill'; 
0

這是一個非規範化,這是不好的做法。我們必須每次維護availability我們更新其他兩列之一。這可能比僅在需要時計算可用資金更昂貴。

更好的方法是使用檢查約束來明確隱含的業務規則。考慮一下這個版本的表格:

create table my_table (
    id varchar2(10) not null primary key 
    , max_amount number not null 
    , used_amount number default 0 not null 
    , constraint check_available_amount 
     check (max_amount - used_amount >= 0) 
); 

現在我們更新比爾的帳戶(我知道這是不太你的測試數據表示,但無論如何...)

SQL> insert into my_table values ('bill', 100, 0); 

1 row created. 

SQL> update my_table 
    2 set used_amount = 75 
    3 where id = 'bill' 
    4/

1 row updated. 

SQL> update my_table 
    2 set used_amount = used_amount + 30 
    3 where id = 'bill' 
    4/
update my_table 
* 
ERROR at line 1: 
ORA-02290: check constraint (APC.CHECK_AVAILABLE_AMOUNT) violated 


SQL>