有什么方法可以创建此触发器还是我应该使用其他东西?
Is there any way to create this trigger or should I use something else?
这些是表格:
CREATE TABLE Staff
(
staffID INTEGER,
staffName VARCHAR(20),
staffSurname VARCHAR(20),
DOB DATE NOT NULL,
staffBranchNo INTEGER,
salary DECIMAL(5,2),
startDateOfWork DATE
);
ALTER TABLE Staff
ADD (CONSTRAINT staff_pk PRIMARY KEY(staffID));
CREATE TABLE Branch
(
branchNo INTEGER,
branchCity varchar(20),
branchTotalStaffNumber INTEGER
);
ALTER TABLE Branch
ADD (CONSTRAINT branch_pk PRIMARY KEY(branchNo));
我需要一个触发器,根据 staffBranchNo 更新 branchTotalStaffNumber,当添加新员工时,更新或删除现有员工。
我尝试了一些触发器,但 none 其中包括我需要的三个操作。
下面的触发器不起作用。
CREATE OR REPLACE TRIGGER staff_trigger
BEFORE INSERT OR UPDATE OR DELETE ON Staff
FOR EACH ROW
BEGIN
CASE
WHEN INSERTING THEN
INSERT INTO branch (branchTotalStaffNumber)
VALUES(:NEW.branchTotalStaffNumber);
WHEN UPDATING THEN
UPDATE branch SET branchTotalStaffNumber = :NEW.branchTotalStaffNumber;
WHEN DELETING THEN
delete from branch where staffBranchNo = :new.branchTotalStaffNumber;
END CASE;
END;
/
您不应使用 trigger
来存储计算值。但是如果你正在学习那么你应该使用下面的代码(见内联评论)
CREATE OR REPLACE TRIGGER staff_trigger
BEFORE INSERT OR UPDATE OR DELETE ON Staff
FOR EACH ROW
BEGIN
IF INSERTING THEN -- used IF . CASE usage is not allowed as IF
UPDATE branch SET branchTotalStaffNumber = branchTotalStaffNumber + 1
Where branchno = :new.staffBranchNo; -- used :new to identify the record
ELSIF UPDATING THEN
-- update the branch table only if staffBranchno is updated
-- adding one staff to the new branch
IF :new.staffBranchNo <> :old.staffBranchNo THEN
UPDATE branch SET branchTotalStaffNumber = branchTotalStaffNumber + 1
Where branchno = :new.staffBranchNo;
-- removing one staff from old branch
UPDATE branch SET branchTotalStaffNumber = branchTotalStaffNumber - 1
Where branchno = :old.staffBranchNo;
END IF;
ELSE -- IF DELETING can be omitted
-- removing one staff from branch for delete action
UPDATE branch SET branchTotalStaffNumber = branchTotalStaffNumber - 1
Where branchno = :old.staffBranchNo;
END IF;
END;
/
请注意,您还可以使用 OF
子句和其中的列名来创建触发器。仅当 OF
子句中提到的列的值更改时才会执行触发器。
这些是表格:
CREATE TABLE Staff
(
staffID INTEGER,
staffName VARCHAR(20),
staffSurname VARCHAR(20),
DOB DATE NOT NULL,
staffBranchNo INTEGER,
salary DECIMAL(5,2),
startDateOfWork DATE
);
ALTER TABLE Staff
ADD (CONSTRAINT staff_pk PRIMARY KEY(staffID));
CREATE TABLE Branch
(
branchNo INTEGER,
branchCity varchar(20),
branchTotalStaffNumber INTEGER
);
ALTER TABLE Branch
ADD (CONSTRAINT branch_pk PRIMARY KEY(branchNo));
我需要一个触发器,根据 staffBranchNo 更新 branchTotalStaffNumber,当添加新员工时,更新或删除现有员工。
我尝试了一些触发器,但 none 其中包括我需要的三个操作。 下面的触发器不起作用。
CREATE OR REPLACE TRIGGER staff_trigger
BEFORE INSERT OR UPDATE OR DELETE ON Staff
FOR EACH ROW
BEGIN
CASE
WHEN INSERTING THEN
INSERT INTO branch (branchTotalStaffNumber)
VALUES(:NEW.branchTotalStaffNumber);
WHEN UPDATING THEN
UPDATE branch SET branchTotalStaffNumber = :NEW.branchTotalStaffNumber;
WHEN DELETING THEN
delete from branch where staffBranchNo = :new.branchTotalStaffNumber;
END CASE;
END;
/
您不应使用 trigger
来存储计算值。但是如果你正在学习那么你应该使用下面的代码(见内联评论)
CREATE OR REPLACE TRIGGER staff_trigger
BEFORE INSERT OR UPDATE OR DELETE ON Staff
FOR EACH ROW
BEGIN
IF INSERTING THEN -- used IF . CASE usage is not allowed as IF
UPDATE branch SET branchTotalStaffNumber = branchTotalStaffNumber + 1
Where branchno = :new.staffBranchNo; -- used :new to identify the record
ELSIF UPDATING THEN
-- update the branch table only if staffBranchno is updated
-- adding one staff to the new branch
IF :new.staffBranchNo <> :old.staffBranchNo THEN
UPDATE branch SET branchTotalStaffNumber = branchTotalStaffNumber + 1
Where branchno = :new.staffBranchNo;
-- removing one staff from old branch
UPDATE branch SET branchTotalStaffNumber = branchTotalStaffNumber - 1
Where branchno = :old.staffBranchNo;
END IF;
ELSE -- IF DELETING can be omitted
-- removing one staff from branch for delete action
UPDATE branch SET branchTotalStaffNumber = branchTotalStaffNumber - 1
Where branchno = :old.staffBranchNo;
END IF;
END;
/
请注意,您还可以使用 OF
子句和其中的列名来创建触发器。仅当 OF
子句中提到的列的值更改时才会执行触发器。