如何使触发器像外键一样工作?

0 sql database firebird

我需要使用触发器创建外键,而不仅仅是使用这样的更改表:

 alter table WORKER
      add constraint WORKER_idDepartment_FK
      foreign key (idDepartment)
      references DEPARTMENT (idDepartment);
Run Code Online (Sandbox Code Playgroud)

有人可以帮帮我吗?

And*_*jeŭ 6

在极少数情况下,您放弃标准 FOREIGN KEY 机制转而使用其他机制。例如,我们有一个包含非常大的表的数据库,其中创建了数十个 FK。这些外键占用了数百兆字节的磁盘空间。就其性质而言,他们引用的表的记录数比主表中的记录数少 10000-100000 倍。切换到触发器以支持数据完整性后,我们显着减少了 db 文件大小,并获得了一些整体性能提升。

外键是这样的:

 alter table WORKER
      add constraint WORKER_idDepartment_FK
      foreign key (idDepartment)
      references DEPARTMENT (idDepartment);
Run Code Online (Sandbox Code Playgroud)

可以用两个触发器模拟:

 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
Run Code Online (Sandbox Code Playgroud)

您可以轻松调整这些触发器以实现 CASCADE 规则或支持可空字段。