如何根据1 Select Statement

时间:2016-02-01 18:35:48

标签: java mysql triggers

考虑我的Ajax调用是什么样的(在我解释问题的代码下面):

 $.ajax({
                type : "GET",
                url : "servlet",
                data: {course_name_param:selectedOption},
                dataType:"json",
                success : function(data) {
                    $('#startDate').empty();
              $('#startDate').append('<option value="">Select Start Date</option>');
     $.each(data, function(index, jsonData) {

  /*Here below is where I check availability*/
 if(jsonData.students_registered < jsonData.max_size){

      /*Display available courses*/
  }
}

我有一个MySQL表,其中包含有关可用于教育课程的课程的信息。其中1个字段是可用的插槽(最大容量)。

注册是一个插入声明。我需要通过检查插入时实际可用的插槽来控制它。

目前,我使用对此表的Ajax调用执行检查。当多个用户在时间(不到一分钟)内相对接近地加载页面时,该检查是无用的。

问题:

  • 如何远离前端实现这一目标?

  • 这是否应该包含在保存我的逻辑的类中 插入陈述?

    我不会在SO问题中看到这种情况,只是在避免重复输入的情况下,这不是我的情况。

    非常感谢任何建议。

2 个答案:

答案 0 :(得分:1)

您可以简单地构建查询,以便只使用打开的插槽撤回课程。这样的事情可能会给你一个想法:

SELECT   courses.title
FROM     courses 
WHERE    students_registered < max_size

如果要确保对数据库进行验证,可以使用条件插入:

INSERT INTO enrollments(course_id, student_id)  
SELECT <your course id>, <your student id> FROM dual
WHERE EXISTS (
  SELECT * FROM courses
  WHERE  id = <your course id>
  AND    students_registered < max_size
)

答案 1 :(得分:0)

A&#34;插入之前&#34;触发用户插入的表。我采用这种方法。然后在应用程序中处理SQLException:

    CREATE DEFINER=`root`@`localhost` TRIGGER before_insert_registration
BEFORE INSERT ON registration 
FOR EACH ROW
BEGIN

DECLARE num_rows INTEGER;

Declare x INTEGER;
SET x = NEW.course_id;

SELECT 
    COUNT(*)
INTO num_rows FROM  courses
WHERE
    course_id = NEW.course_id
        AND maxsize > students_registered;

    IF num_rows < 1 THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Testing Custom Fail-Over';
    END IF;
END