【问题标题】:How can I stop a mysql insert statement from executing when a select statement returns nothing?当 select 语句不返回任何内容时,如何停止执行 mysql insert 语句?
【发布时间】:2016-02-03 23:42:02
【问题描述】:

考虑一下我的选择语句:

    SELECT course_id from courses 
    WHERE
    course_id = (
      SELECT course_id FROM courses
      WHERE  course_id = 3
      AND max_size > students_registered);
  • 要插入的值不是来自选择。它们由用户从表单提交。选择告诉我是否有可用的插槽来进行插入。

目前我通过 1 个 Ajax 调用在前端进行此检查,我正试图将其从前端移开。任何建议将不胜感激。

  • insert 语句只向表中插入 8 个值。没有什么特别的东西对这个问题有价值。我进行了广泛的研究。我唯一的选择是将所有内容都移入存储过程吗?

  • 我需要此插入文字在选择返回无行或空时失败

请告诉我任何可以提供帮助的详细信息。

【问题讨论】:

  • 在插入时使用前触发器
  • @davejal 之前的触发器是我的方式,尽管您提到的 SO 问题没有提到实际失败的信号代码 4500。你会说它仍然是重复的吗?
  • 这一切都取决于解释,但你在那里找到了解决方案,所以我们不需要讨论它是否重复。
  • @davejal,你的建议是正确的。而且我从昨天开始就一直在考虑那个 666 相同的事情,ty。

标签: mysql sql insert


【解决方案1】:

您可以明智地使用INSERT ... SELECT 来控制它。

例如,

INSERT INTO mytable (course_id, col2, col3)
SELECT a.course_id AS col1, 'value' AS col2, 'another_value' AS col3
  FROM courses a
 WHERE course_id = 3
   AND max_size > students_registered
 LIMIT 1

诀窍是编写一个SELECT 查询,该查询准确返回您要插入的值,并根据您的条件返回一行或无。编写该查询并对其进行调试。确保它有效。

然后将INSERT 子句放在它前面。

如果SELECT 没有出现任何行,INSERT 将不会插入任何内容。如果SELECT 出现一行,那将被插入。

这是一个很好的方法;您不必担心竞争条件或事务。

编辑。请注意,SELECT 语句包含从表中派生的值和常量值的混合。如果您不使用表中的任何值,它可能如下所示:

 SELECT ?param1 AS col1, ?param2 AS col2, ?param3 AS col3

你没有提到你的宿主语言,所以上面的 ?param 项目只是我对来自表单的数据的适当占位符的猜测。

这种形式的 SELECT 仍然可以满足您的需求;如果WHERE 子句不返回任何行,则不会插入任何内容。

【讨论】:

    【解决方案2】:

    一种方法是将其合并到insert 语句中。我认为这是逻辑:

    insert into courses (course_id, . . . )
        select 3, . . .
        from dual
        where exists (select 1 from courses c where course_id = 3 and max_size < students_registered);
    

    您还可以编写一个触发器来合并类似的逻辑。其他数据库实现了check 约束,但遗憾的是,MySQL 实际上并没有对它们做任何事情。

    【讨论】:

    • 我使用了后者,创建了一个触发器来处理检查。 Ty 表示方向。
    猜你喜欢
    • 2016-04-20
    • 2016-09-11
    • 1970-01-01
    • 2011-07-04
    • 2014-05-17
    • 2019-03-22
    • 1970-01-01
    • 2011-04-20
    • 2020-12-10
    相关资源
    最近更新 更多