我有一个具有以下结构的表 passenger
。
CREATE TABLE passenger (
id NUMERIC(12,0) NOT NULL,
station VARCHAR(3),
adult NUMERIC(3,0),
child NUMERIC(3,0),
infant NUMERIC(3,0),
crew NUMERIC(3,0) DEFAULT 0,
paying NUMERIC(4,0),
non_paying NUMERIC(4,0),
total_passenger NUMERIC(3,0),
PRIMARY KEY (id)
);
初始记录如下。
id | station | adult | child | infant | crew | paying | non_paying | total_passenger
100 | GWN | 20 | 4 | 1 | 2 | 24 | 3 | 27
paying
字段的值是通过将adult
和child
值相加计算得出的。而且,通过对 infant
和 crew
求和,我可以获得 non_paying
值。然后我可以对 paying
和 non_paying
字段求和以获得 total_passenger
。
问题是,当我更新 adult
、child
、infant
和 crew
字段时,可能每个字段的NULL
值,数据库是否可以重新计算paying
、non_paying
和total_passenger
而不需要更新手动?
我尝试了以下查询但结果出乎意料。
UPDATE passenger
SET adult = NVL(NULL, adult),
child = NVL(6, child),
infant = NVL(3, infant),
crew = NVL(NULL, crew),
paying = adult + child,
non_paying = infant + crew,
total_passenger = paying + non_paying
WHERE id = 100;
NULL
关键字来自准备语句参数,它可能是空值。如何自动更新最后三个字段?
最佳答案
您可以使用触发器在 UPDATE
发生后对 passenger
表进行额外更新:
CREATE OR REPLACE TRIGGER update_passenger
AFTER UPDATE OF passenger
FOR EACH ROW
BEGIN
UPDATE passenger
SET
paying = NVL(:NEW.adult, 0) + NVL(:NEW.child, 0),
non_paying = NVL(:NEW.infant, 0) + NVL(:NEW.crew, 0),
total_passenger = NVL(:NEW.adult, 0) + NVL(:NEW.child, 0) +
NVL(:NEW.infant, 0) + NVL(:NEW.crew, 0)
END;
要使用触发器,您只需像往常一样对 passenger
进行更新。如果您将 adult
、child
、infant
或 crew
字段更新为 NULL
对于给定的记录,我的触发器将在计算总计时将 NULL
视为 0
。
关于java - Oracle 从其他列计算结果中更新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34647378/