【问题标题】:When are table constraints checked in SQL inserts?何时在 SQL 插入中检查表约束?
【发布时间】:2018-12-12 15:44:47
【问题描述】:

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

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

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

【问题讨论】:

  • 触发器可以修改输入/来自有效值的输入。然后约束说了算!
  • 所以我必须重复一些测试以确保我可以运行该函数,以防该函数取决于这些值的有效性?
  • 没有任何实际代码很难说。但是,如果您有一个列分母,并且检查约束为“ 0”,那么在执行任何除法(在触发器中)之前,最好在触发器中检查该值 0。跨度>

标签: sql postgresql database-trigger


【解决方案1】:

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

如果您在 BEFORE 触发器中遇到异常,因为您正在那里执行操作(例如,被约束排除的被零除),那么触发器和整个 INSERT 将是中止,就像约束稍后会抛出异常一样。所以没什么好担心的。

另一方面,如果您希望在检查之前检查约束,只需在AFTER 触发器中执行检查。在那里抛出异常也会中止插入。

如果两者都有效,请使用BEFORE 触发器。如果在插入行之前抛出异常,肯定不会生成死元组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    相关资源
    最近更新 更多