如何使触发器像外键一样工作?
How to make a Trigger work like a Foreign Key?
我需要使用触发器创建一个外键,而不是像这样只使用一个改变 table:
alter table WORKER
add constraint WORKER_idDepartment_FK
foreign key (idDepartment)
references DEPARTMENT (idDepartment);
有人可以帮我吗?
在极少数情况下,您会放弃标准的 FOREIGN KEY 机制以支持其他机制。例如,我们有一个非常庞大的 table 数据库,其中创建了数十个 FK。这些外键占用了数百兆的磁盘 space。就其性质而言,他们引用 table 的记录数比主 table 少 10000-100000 倍。切换到触发器以支持数据完整性后,我们显着减少了数据库文件的大小,并获得了一些整体性能提升。
像这样的外键:
alter table WORKER
add constraint WORKER_idDepartment_FK
foreign key (idDepartment)
references DEPARTMENT (idDepartment);
可以用两个触发器模拟:
CREATE TRIGGER aiu_worker FOR WORKER
AFTER INSERT OR UPDATE
POSITION 0
AS BEGIN
IF (NOT EXISTS(
SELECT idDepartment
FROM DEPARTMENT
WHERE idDepartment = NEW.idDepartment)) THEN
EXCEPTION my_exception 'There is no department with id=' ||
NEW.idDepartment;
END
CREATE TRIGGER ad_department FOR DEPARTMENT
AFTER DELETE
POSITION 0
AS BEGIN
IF (EXISTS (
SELECT idDepartment
FROM WORKER
WHERE idDepartment = OLD.idDepartment)) THEN
BEGIN
EXCEPTION my_exception 'Can not delete record';
END
END
您可以轻松调整这些触发器以实施 CASCADE 规则或支持可为空的字段。
我需要使用触发器创建一个外键,而不是像这样只使用一个改变 table:
alter table WORKER
add constraint WORKER_idDepartment_FK
foreign key (idDepartment)
references DEPARTMENT (idDepartment);
有人可以帮我吗?
在极少数情况下,您会放弃标准的 FOREIGN KEY 机制以支持其他机制。例如,我们有一个非常庞大的 table 数据库,其中创建了数十个 FK。这些外键占用了数百兆的磁盘 space。就其性质而言,他们引用 table 的记录数比主 table 少 10000-100000 倍。切换到触发器以支持数据完整性后,我们显着减少了数据库文件的大小,并获得了一些整体性能提升。
像这样的外键:
alter table WORKER
add constraint WORKER_idDepartment_FK
foreign key (idDepartment)
references DEPARTMENT (idDepartment);
可以用两个触发器模拟:
CREATE TRIGGER aiu_worker FOR WORKER
AFTER INSERT OR UPDATE
POSITION 0
AS BEGIN
IF (NOT EXISTS(
SELECT idDepartment
FROM DEPARTMENT
WHERE idDepartment = NEW.idDepartment)) THEN
EXCEPTION my_exception 'There is no department with id=' ||
NEW.idDepartment;
END
CREATE TRIGGER ad_department FOR DEPARTMENT
AFTER DELETE
POSITION 0
AS BEGIN
IF (EXISTS (
SELECT idDepartment
FROM WORKER
WHERE idDepartment = OLD.idDepartment)) THEN
BEGIN
EXCEPTION my_exception 'Can not delete record';
END
END
您可以轻松调整这些触发器以实施 CASCADE 规则或支持可为空的字段。