何时在SQL插入中检查表约束?

时间:2018-12-12 15:44:47

标签: sql postgresql database-trigger

假设我有一个触发器,如果​​不满足给定条件,该触发器应防止在表中插入某些内容。这意味着我可能应该使用BEFORE INSERT。这是正确的吗?

但是,如果我使用BEFORE INSERT,则在触发器上运行函数时将不会检查完整性约束。因此,它们可能会违反约束(例如非null约束)。这样做的主要问题是我可能会尝试对无效数据进行操作。

有没有一种方法可以强制检查约束,然后运行触发器,而无需先将内容实际插入表中?

1 个答案:

答案 0 :(得分:0)

不清楚尝试使用无效数据进行操作的危险是什么意思。

如果您在BEFORE触发器中因在此执行操作而发生异常(例如,被约束排除的被零除),则触发器和整个{{1 }}将被中止,就像约束将在以后引发异常一样。因此,无需担心。

另一方面,如果希望在执行检查之前先检查约束,则只需在INSERT触发器中执行检查即可。在那里抛出异常也会同样终止插入。

如果两种方法都起作用,请使用AFTER触发器。如果在插入行之前引发了异常,则确保不会生成无效的元组。