我有3列正在使用在表中。第一個是可以使用的最大量,第二個是已使用的量。現在,我想讓第三列成爲最大(1st-2nd,0)。帶有最大功能的更新
我使用update my_table set availability = max(1st-2nd,0) where type = 'bill';
但在過程中,這是不可能的。主要的是我不想要負面價值,我想要0而不是它。我怎樣才能做到這一點。
我有3列正在使用在表中。第一個是可以使用的最大量,第二個是已使用的量。現在,我想讓第三列成爲最大(1st-2nd,0)。帶有最大功能的更新
我使用update my_table set availability = max(1st-2nd,0) where type = 'bill';
但在過程中,這是不可能的。主要的是我不想要負面價值,我想要0而不是它。我怎樣才能做到這一點。
使用GREATEST函數:
UPDATE my_table
SET availability = GREATEST(1st-2nd,0)
WHERE type = 'bill';
這是一個非規範化,這是不好的做法。我們必須每次維護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>