好的。这可以使用以下步骤来完成,但请注意,您不能直接从表中删除。相反,您可以从具有相同结构的视图中删除并使用替代触发器更新父表。此外,由于您要从员工表中删除 ID,因此应该至少有一个其他键来唯一标识员工。考虑到所有这些前体,以下是步骤。
创建一个UNIQUE KEY ON employee_name。如果您可以确保employee_name 在整个表中始终是唯一的,则此步骤不是强制性的。但如果我们不这样做,就无法识别员工记录。
ALTER TABLE emp ADD CONSTRAINT emp_uk UNIQUE(employee_name);
下一步创建一个与emp 表具有相同定义的视图。
CREATE OR REPLACE VIEW emp_view AS
SELECT * FROM EMP;
为逐行删除操作创建一个INSTEAD OF TRIGGER
在视图上emp_view
CREATE OR REPLACE TRIGGER trigg_emp_v INSTEAD OF
DELETE ON emp_view FOR EACH ROW
BEGIN
DELETE
FROM EMP
WHERE emp_id = :OLD.emp_id ;
MERGE INTO EMP e USING
(SELECT RANK() OVER (ORDER BY emp_id) emp_id,
employee_name,
salary
FROM
( SELECT * FROM emp WHERE emp_id != :OLD.emp_id
)
) v ON ( e.employee_name = v.employee_name )
WHEN MATCHED THEN
UPDATE SET e.emp_id = v.emp_id;
END;
/
这里的选择查询正在使用RANK() 函数获取重新计算的emp_id,而merge 语句正在更新emp 表。
测试ID = 5
Before Deletion
SELECT * FROM EMP;
EMP_ID EMPLOYEE_NAME SALARY
---------- ---------------------------------------- ----------
1 EMPLOYEE_1 1001
2 EMPLOYEE_2 1002
3 EMPLOYEE_3 1003
4 EMPLOYEE_4 1004
5 EMPLOYEE_5 1005
6 EMPLOYEE_6 1006
7 EMPLOYEE_7 1007
8 EMPLOYEE_8 1008
9 EMPLOYEE_9 1009
10 EMPLOYEE_10 1010
--------------------------------------------------------------------
删除操作
DELETE FROM EMP_VIEW where emp_id = 5;
删除后,输出是这样的。
SELECT * FROM EMP;
EMP_ID EMPLOYEE_NAME SALARY
---------- ---------------------------------------- ----------
1 EMPLOYEE_1 1001
2 EMPLOYEE_2 1002
3 EMPLOYEE_3 1003
4 EMPLOYEE_4 1004
5 EMPLOYEE_6 1006
6 EMPLOYEE_7 1007
7 EMPLOYEE_8 1008
8 EMPLOYEE_9 1009
9 EMPLOYEE_10 1010
让我知道您的反馈。