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
我希望我的标题是对的,因为我真的不知道怎么表达这个!!
这是背景...
我有一个将数据插入数据库的应用程序。数据库包含日期字段和数据字段(还有其他字段,但为简单起见,仅需要这两个字段)。同一日期只能有 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