Mysql 仅在未达到限制时插入

Mysql insert only if limit has not been reached

我希望我的标题是对的,因为我真的不知道怎么表达这个!!

这是背景...

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

我目前的做法是查询一个日期有多少条记录。如果小于 9,我将插入数据。

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

我认为有两种解决方案,但我想知道 A,如果我是对的!或者B有没有更好的解决办法

我觉得...

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

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

或者,如果条目少于 9 个,是否可以让单个查询首先检查?

非常感谢,

加文

你怕百万秒内有人先插入新记录?

我也有这个问题,所以我给你搜了一下,你可以通过两种方式:

例如,如果您有一个名为 date_table 的 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 系统 table,因此您不需要创建它

如果您不明白上述查询的工作原理:

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