考虑我的选择陈述:
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个值插入表中。没有什么特别值得这个问题的价值。我进行了广泛的研究。我唯一的选择是将所有内容都移到存储过程中吗?
当select不返回任何行或null时,我需要此插入失败,因此我可以将右视图/ jsp返回给我的应用程序。
请告诉我我可以提供的任何帮助细节。
答案 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实际上并没有对它们做任何事情。