当select语句什么都不返回时,如何停止执行mysql insert语句?

时间:2016-02-02 23:28:47

标签: mysql sql insert

考虑我的选择陈述:

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

目前我通过1次Ajax调用检查前端,我试图将其从前端移开。任何建议都将不胜感激。

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

  • 当select不返回任何行或null时,我需要此插入失败,因此我可以将右视图/ jsp返回给我的应用程序。

请告诉我我可以提供的任何帮助细节。

2 个答案:

答案 0 :(得分:2)

您可以明智地使用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子句没有返回任何行,则不会插入任何内容。

答案 1 :(得分:1)

一种方法是将其合并到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实际上并没有对它们做任何事情。