更新一个 table 中的列时,如何通过触发器更新多个 table?
How can I update multiple tables via a trigger when updating a column in one table?
我在 Oracle 数据库 10g 中有两个 table。我想通过更新 base_information
table.
中的余额来更新 table 中的余额
我想用触发器来做这个,但我不明白我该怎么做。
Table 1:
Create TABLE Base_information
(
account_no varchar2(40) primary key
check(REGEXP_LIKE(account_no, '[A-Za-z][0-9]{13}')),
first_name varchar2(25) unique not null
last_name varchar2(25),
address varchar2(40) not null,
contact_no varchar2(15) not null
check(REGEXP_LIKE(contact_no, '[+][0-9]{13}')),
code varchar2(20) ,
balance double precision,
online_account varchar2(15)
);
Table 2:
Create TABLE User_table
(
account_no varchar2(40)
check(REGEXP_LIKE(account_no, '[A-Za-z][0-9]{13}')),
balance double precision,
transfer_to varchar2(40)
check(REGEXP_LIKE(transfer_to , '[A-Za-z][0-9]{13}')),
transfered_amount double precision,
transfer_date Timestamp,
user_id varchar2(20),
CONSTRAINT rfk1 foreign key(user_id) references Login_table (user_id),
CONSTRAINT rfk2 foreign key(account_no) references Base_information(account_no)
);
我们将不胜感激。
正如其他人所说,最好在两个单独的语句中完成。
无论如何,如果您仍然对如何以这种方式做到这一点感兴趣,您可以这样做:
CREATE OR REPLACE TRIGGER COSO_BT
BEFORE UPDATE
ON BASE_INFORMATION REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
if :new.balance != :old.balance
then
update USER_TABLE
set balance = :new.balance
where account_no = :new.account_no;
end if;
END;
/
如您所见,当您更新 base_information table 时,如果新余额值与旧余额值不同,user_table [=21 中的余额值=] 更新为相应 account_no 记录中的新值。
对不起我的英语。
希望这对您有所帮助!
我在 Oracle 数据库 10g 中有两个 table。我想通过更新 base_information
table.
我想用触发器来做这个,但我不明白我该怎么做。
Table 1:
Create TABLE Base_information
(
account_no varchar2(40) primary key
check(REGEXP_LIKE(account_no, '[A-Za-z][0-9]{13}')),
first_name varchar2(25) unique not null
last_name varchar2(25),
address varchar2(40) not null,
contact_no varchar2(15) not null
check(REGEXP_LIKE(contact_no, '[+][0-9]{13}')),
code varchar2(20) ,
balance double precision,
online_account varchar2(15)
);
Table 2:
Create TABLE User_table
(
account_no varchar2(40)
check(REGEXP_LIKE(account_no, '[A-Za-z][0-9]{13}')),
balance double precision,
transfer_to varchar2(40)
check(REGEXP_LIKE(transfer_to , '[A-Za-z][0-9]{13}')),
transfered_amount double precision,
transfer_date Timestamp,
user_id varchar2(20),
CONSTRAINT rfk1 foreign key(user_id) references Login_table (user_id),
CONSTRAINT rfk2 foreign key(account_no) references Base_information(account_no)
);
我们将不胜感激。
正如其他人所说,最好在两个单独的语句中完成。
无论如何,如果您仍然对如何以这种方式做到这一点感兴趣,您可以这样做:
CREATE OR REPLACE TRIGGER COSO_BT
BEFORE UPDATE
ON BASE_INFORMATION REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
if :new.balance != :old.balance
then
update USER_TABLE
set balance = :new.balance
where account_no = :new.account_no;
end if;
END;
/
如您所见,当您更新 base_information table 时,如果新余额值与旧余额值不同,user_table [=21 中的余额值=] 更新为相应 account_no 记录中的新值。
对不起我的英语。
希望这对您有所帮助!