对于某个表,如果某个字段更新为Null,并且该行的所有字段现在都为空,我想删除该行。我知道这可以通过触发器完成,但我听说应尽可能避免使用触发器。是否有另一种解决方案可以避免触发,并且成本更低?在这种情况下触发器甚至会有多昂贵(它比运行两个查询要便宜吗?)
答案 0 :(得分:2)
您有三种选择:
每次更新后放入DELETE FROM TABLE WHERE FIELD == NULL。
使用触发器
通过存储过程集中所有更新,以便您可以在更新记录时调用SP,然后可以在#1中调用DELETE FROM命令。
答案 1 :(得分:0)
尽可能不应避免触发器。它们应该谨慎使用。
首先,在我参与的许多系统中,所有DML操作都嵌入在存储过程中。基本上,触发器将执行的任何操作都在存储过程中 - 以及其他功能,例如日志记录。
其次,如果您遇到需要触发的问题,请使用触发器。例如,在Oracle 12C之前,您需要一个触发器来添加自动递增的主键。如果你需要的话,一定要这样做。
不要过火。但是你的特定问题似乎是一个触发器非常有用的例子。
要意识到可能还有其他解决方案。例如,也许一个视图会做你想要的:
create view v_t as
select t.*
from t
where col1 is not null or col2 is not null or . . .;
这将节省触发器的所有开销。如果表格太大,您可以使用预定作业删除所有 - NULL
行。