【问题标题】:Mysql insert only if limit has not been reachedMysql 仅在未达到限制时插入
【发布时间】:2015-01-07 07:41:59
【问题描述】:

我希望我的标题是正确的,因为我真的不知道如何措辞!

这是背景...

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

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

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

我认为有两种解决方案,但我想知道 A,如果我完全正确的话!或者 B 有没有更好的解决方案。

我觉得……

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

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

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

非常感谢,

加文

【问题讨论】:

标签: php mysql sql database


【解决方案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

【讨论】:

  • Yami,我喜欢答案 B 的想法。我现在正在为如何向此查询添加其他字段而苦恼?
  • 已编辑,希望您理解
  • 这似乎不是比简单地锁定表以确保避免冲突/插入第 9 个值更复杂吗?
  • 我同意你的观点,锁定表可能更安全,但我认为每个查询都有自己的优先级,无论如何,我真的相信你是对的
  • 我必须承认,尝试实现这个有点乏味!!我认为您的正确 Mawg,锁定表以进行写入可能是最好的选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-09
相关资源
最近更新 更多