使用触发器有条件地插入的最佳方式

时间:2014-10-27 19:47:45

标签: mysql sql

我想创建一个SQL触发器,当且仅当它传递给定条件时才插入新行。我可以想到几种方法来做到这一点,但我不确定哪种方式最好或最正确。

  1. 执行AFTER INSERT触发器,如果​​条件失败则删除新行。
  2. 执行BEFORE INSERT触发器,如果​​失败则引发应用程序错误。
  3. ???

1 个答案:

答案 0 :(得分:1)

选项1会创建竞争条件。我会明确地避免这种情况。

选项2可能会导致INSERT明显变慢,但可以正常工作。

选项3是一个存储过程,但您可能需要为插入的每一行调用proc,除非您正确设置安全性,否则实际上可能无法阻止用户直接插入数据。

选项4是将所有内容插入到临时表或事务表中,然后使用带有查询或视图的代理或过程将有效数据仅移动到实时表中。这是一个非常古老的学校,相对讨厌,因为你不再使用像现代RDBMS这样的RDBMS了。关键违规问题和同步会遇到很多问题。并且您遇到与选项3相同的安全问题。此方法通常仅用于批量导入和导出。

选项5是验证应用程序中的数据而不是数据库。这将起作用,但当客户尝试像RDBMS一样使用您的RDBMS时会遇到问题。然后,您遇到与选项3相同的安全问题。它实际上无法解决问题或阻止应用程序外的程序存储无效数据。

选项6是使用支持CHECK约束的RDBMS,它几乎不是MySQL或MariaDB。 MS SQL Server,Oracle,DB2,PostgreSQL,甚至MS Access和SQLite支持CHECK约束。 MySQL没有中等可笑。