只有在未达到限制时才插入Mysql

时间:2015-01-07 07:41:59

标签: php mysql sql database

我希望我的标题是正确的,因为我真的不知道怎么说这个!!

这是背景......

我有一个应用程序将数据插入数据库。 db包含一个日期字段和数据字段(还有其他字段,但为简单起见,这两个字段是唯一需要的字段)。同一日期只能有8个条目,不再有。在正常操作中,这不是一个真正的问题,但是每个月两次数据库在一天结束时受到严重打击。

我目前的做法是查询日期的记录数。如果小于9,我插入数据。

它从未发生过,但我担心的是请求A进入并检查数据库并发现有7条记录。可以插入。但是在A可以插入之前,请求B进来并且只找到7条记录。可以插入。但那将在一个日期输入9条记录。这不可能发生。

我认为这有两个解决方案,但想知道A,如果我是对的!或者B有更好的解决方案。

我想......

A)我可以在交易中完成。但是,我还会遇到同样的问题吗?据我所知,只要交易中没有任何查询失败,它就会运行。

B)使用存储过程先检查然后插入。我对存储过程的经验很少,所以我必须承认我不知道我在这里说的是什么!

或者,有没有办法让一个查询首先检查是否少于9个条目?

非常感谢,

加文

1 个答案:

答案 0 :(得分:1)

你害怕有人会在其他人插入新记录之前插入新记录吗?

我也有这个问题,所以我只是为你搜索了一些东西,你可以用两种方式做到这一点:

例如,如果您有一个名为 date_table 的表格,它看起来像:

date_field
----------
1998-07-13
1992-03-23
1998-09-17
1994-02-30

A)计算行数,然后在8行以下插入行。 (使用PHP和MySQL)

首先,通过它得到多少行:

SELECT COUNT(*) AS Num FROM date_table WHERE date_field = '1998-07-13'

这样您就可以获得 Num 字段,该字段告诉您 1998-07-13 的行数,

然后使用PHP来防止用户在它等于8时插入相同的日期:

<?php if($DB['Num'] >= 8) exit('Sorry, no more same value'); ?>

否则插入行。


或者您不相信PHP,或者您认为有人会在100万秒之前插入行

B)只有在8行下只有一个查询时才插入它:

INSERT INTO date_table (date_field) 
     SELECT '1998-07-13' 
     FROM dual 
     WHERE (SELECT COUNT(*) FROM date_table WHERE date_field = '1998-07-13') < 9;

请注意:dual是一个mysql系统表,因此您不需要创建它

如果您不了解上述查询的工作原理:

insert into TABLE_NAME (TABLE_FIELD) 
     select VALUE_YOU_WANT_TO_INSERT
     from dual 
     where (select count(*) 
            from TABLE_NAME 
            where THE_FIELD_YOU_WANT_TO_CHECK = '1998-07-13'
           ) < LESS_THEN_HOW_MUCH;

编辑:添加更多字段会更改以下行:

INSERT INTO date_table (field1, field2, field3) 
     SELECT value1, value2, value3