对于某个表,如果一个字段被更新为null,并且该行的所有字段现在都为null,我想删除这一行。我知道这可以用触发器来完成,但我听说触发器应该尽可能避免。有没有另一种解决方案可以避免触发,而且成本更低?在这种情况下,触发器的成本有多高(是否比运行两个查询便宜?)
kuhbmx9i1#
您有三种选择:在每次更新后放入delete from表,其中field==null。使用触发器通过存储过程集中所有更新,以便在更新记录时可以调用sp,然后sp可以调用#1中的delete from命令。
q8l4jmvw2#
不应尽可能避免触发器。他们应该谨慎使用。首先,在我参与的许多系统中,所有的dml操作都嵌入到存储过程中。基本上,触发器可以做的任何事情都在存储过程中——以及其他功能,如日志记录。第二,如果你有一个需要触发器的问题,那么就使用触发器。例如,在oracle12c之前,您需要一个触发器来添加一个自动递增的主键。如果你需要的话,一定要做。别过火了。但你的特殊问题似乎是一个触发器非常有用的例子。一定要意识到可能还有其他解决办法。例如,视图可能会满足您的要求:
create view v_t as select t.* from t where col1 is not null or col2 is not null or . . .;
这将节省触发器的所有开销。如果表太大,可以删除all- NULL 使用计划作业的行。
NULL
2条答案
按热度按时间kuhbmx9i1#
您有三种选择:
在每次更新后放入delete from表,其中field==null。
使用触发器
通过存储过程集中所有更新,以便在更新记录时可以调用sp,然后sp可以调用#1中的delete from命令。
q8l4jmvw2#
不应尽可能避免触发器。他们应该谨慎使用。
首先,在我参与的许多系统中,所有的dml操作都嵌入到存储过程中。基本上,触发器可以做的任何事情都在存储过程中——以及其他功能,如日志记录。
第二,如果你有一个需要触发器的问题,那么就使用触发器。例如,在oracle12c之前,您需要一个触发器来添加一个自动递增的主键。如果你需要的话,一定要做。
别过火了。但你的特殊问题似乎是一个触发器非常有用的例子。
一定要意识到可能还有其他解决办法。例如,视图可能会满足您的要求:
这将节省触发器的所有开销。如果表太大,可以删除all-
NULL
使用计划作业的行。