Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用触发器有条件地插入的最佳方法_Mysql_Sql - Fatal编程技术网

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

Mysql 使用触发器有条件地插入的最佳方法,mysql,sql,Mysql,Sql,我想创建一个SQL触发器,当且仅当它通过给定条件时插入新行。我可以想出几种方法来做到这一点,但我不确定哪种是最好的或正确的方法 执行插入后触发器,如果新行不符合条件,则删除新行 执行插入前触发器,如果失败,则引发应用程序错误 选项1创建竞争条件。我会明确避免这样做 选项2可能会导致插入速度明显减慢,但可以正常工作 选项3是一个存储过程,但是您可能需要为插入的每一行调用proc,并且除非您正确设置了安全性,否则实际上可能不会阻止用户直接插入数据 选项4是将所有内容插入staging或transa

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

  • 执行插入后触发器,如果新行不符合条件,则删除新行
  • 执行插入前触发器,如果失败,则引发应用程序错误

  • 选项1创建竞争条件。我会明确避免这样做

    选项2可能会导致插入速度明显减慢,但可以正常工作

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

    选项4是将所有内容插入staging或transaction表,然后使用带有查询或视图的代理或过程将有效数据仅移动到活动表。这是一种非常老派且相对恶劣的做法,因为您不再像现代RDBMS那样使用RDBMS了。密钥冲突问题和同步可能会出现很多问题。你有和选项3一样的安全问题。这种方法目前通常只用于批量进出口

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


    选项6是使用支持
    CHECK
    constraints的RDBMS,这几乎是所有东西,而不是MySQL或MariaDB。MS SQL Server、Oracle、DB2、PostgreSQL,甚至MS Access和SQLite支持
    CHECK
    约束。MySQL没有这样做有点可笑。

    在执行插入之前检查传入数据的存储过程可能会更好吗?我认为在这种情况下没有任何区别。