Oracle SQL建表如何实现插入时字段默认取同表另一字段的百分比值
Oracle实现commission字段自动按price百分比赋值的方法
Oracle的常规DEFAULT默认值语法不支持直接引用同表其他字段作为默认值,要实现插入时commission传入NULL就自动取price的5%,可以根据业务场景选以下两种方案:
方案1:虚拟列实现(Oracle 11g及以上支持,适合commission固定为price5%、不需要自定义值的场景)
直接将commission定义为虚拟列,不需要实际存储,查询时自动按公式计算,数据永远和price保持对应比例:CREATE TABLE SALE ( price NUMBER (5, 2), commission NUMBER (5, 2) GENERATED ALWAYS AS (price * 0.05) VIRTUAL );这种写法下插入数据不需要给commission传值,就算手动传值数据库也会忽略,始终按price的5%返回结果。
方案2:行级触发器实现(全版本Oracle兼容,支持手动传入commission值覆盖默认规则)
如果业务上允许手动指定commission值,仅当传入NULL时才自动计算5%,就用前置插入触发器实现:- 正常建表即可:
CREATE TABLE SALE ( price NUMBER (5, 2), commission NUMBER (5, 2) );- 创建插入前触发的行级触发器:
CREATE OR REPLACE TRIGGER trg_calc_sale_commission BEFORE INSERT ON SALE FOR EACH ROW BEGIN IF :NEW.commission IS NULL THEN :NEW.commission := :NEW.price * 0.05; END IF; END; /执行测试插入语句:
INSERT INTO SALE (price, commission) VALUES(1000, NULL);插入完成后查询SALE表,commission字段会自动被赋值为
50(即1000的5%)。如果插入时给commission传入非NULL值,会优先保留传入的数值,不会触发自动计算。
内容的提问来源于stack exchange,提问作者Gospel77
相关产品推荐
相关产品推荐

