SQL 删除前创建触发器与删除时创建外键
SQL Create Trigger Before Delete vs. Foreign Key On Delete
我有一个 table 引用了另一个。如我所见-删除级联有两种方法:
CREATE TRIGGER BEFORE DELETE
和FOREIGN KEY ON DELETE
有什么区别?性能有什么不同吗?
我想到了FOREIGN KEY
的这个优势:
级联删除更明显,因为它附加在 table 定义中。
完整问题:
我有两个 table:
project(id, ...) <- works_on(id, project_id, ...)
有什么区别
CREATE TABLE works_on (
...
FOREIGN KEY (project_id) REFERENCES project ON DELETE CASCADE
...
);
和
CREATE TRIGGER trigger_delete_cascading
BEFORE DELETE ON project
DELETE works_on
WHERE project_id = id;
如果在删除之前写入触发器,将 DELETE 来自 CHILD TABLE 的记录,并且由于某些服务器错误或其他限制如果记录无法从 MAIN TABLE(PARENT) 中删除,那么它会生成冗余数据。
因此,每当您需要删除以及更多操作(例如维护 LOG table)时,只需使用 Trigger.Otherwise ON DELETE CASCADE
就可以了。
希望对你有帮助。
A FOREIGN KEY
将限制可以存储在 works_on
table 的 project_id
列中的值。您将无法设置 project
table.
中不存在的值
一个TRIGGER
不限制可以存储的值的范围
我有一个 table 引用了另一个。如我所见-删除级联有两种方法:
CREATE TRIGGER BEFORE DELETE
和FOREIGN KEY ON DELETE
有什么区别?性能有什么不同吗?
我想到了FOREIGN KEY
的这个优势:
级联删除更明显,因为它附加在 table 定义中。
完整问题:
我有两个 table:
project(id, ...) <- works_on(id, project_id, ...)
有什么区别
CREATE TABLE works_on (
...
FOREIGN KEY (project_id) REFERENCES project ON DELETE CASCADE
...
);
和
CREATE TRIGGER trigger_delete_cascading
BEFORE DELETE ON project
DELETE works_on
WHERE project_id = id;
如果在删除之前写入触发器,将 DELETE 来自 CHILD TABLE 的记录,并且由于某些服务器错误或其他限制如果记录无法从 MAIN TABLE(PARENT) 中删除,那么它会生成冗余数据。
因此,每当您需要删除以及更多操作(例如维护 LOG table)时,只需使用 Trigger.Otherwise ON DELETE CASCADE
就可以了。
希望对你有帮助。
A FOREIGN KEY
将限制可以存储在 works_on
table 的 project_id
列中的值。您将无法设置 project
table.
一个TRIGGER
不限制可以存储的值的范围