【问题标题】:abort insert if same column value is inserted for more than 10 rows- mysql-php如果相同的列值插入超过 10 行,则中止插入 - mysql-php
【发布时间】:2017-08-30 12:54:04
【问题描述】:

我有一个任务。我必须在 mysql 表中插入几列。

insert into `alreadysent` VALUES (NULL,'".$mobile_number."','".$user."','".$sender."','".date('Y-m-d H:i:s')."');

如果相同的mobile_number被插入10次,它应该接受。但它不应该在第 10 次插入该 mobile_number 后接受。

如果计数小于 10,我会很容易地使用 select 语句并插入。但在这个场景中我不能这样做。所以检查其他一些最佳选项。如果我们将列声明为唯一,我们可以停止插入重复条目,类似地,在 n 次插入后有什么可以给出异常的吗?谢谢!

【问题讨论】:

  • 那是业务逻辑,不应该在SQL查询中。把它放到你的 php 代码中
  • 了解prepared Statements以防止SQL注入
  • 为什么插入前不能SELECT和计数?
  • "但是我不能在这个场景中做。"为什么不?就像你说的那样,将它全部包装在一个事务中并在每次插入之前检查计数。那有什么问题?真的没有其他方法可以做到这一点。也许触发器会起作用,这是我能想到的唯一其他事情。
  • 你必须在某个地方使用一个,无论是在 PHP 中还是在触发器中,无论哪种方式你都需要一个 SELECT。您如何确定表格的当前内容?如果您的老板坚持您不能使用 SELECT,请让他们研究适当的解决方案,因为他们想要施加明显武断且不可行的限制。如果他们真的那么担心负载,那么在单个表上进行选择并不是什么大问题,假设它已正确索引。几乎可以肯定有更高效的方法来优化数据库和应用程序。

标签: php mysql sql-insert


【解决方案1】:

你可以试试这样的条件插入:

INSERT INTO TABLENAME(MOBILENUMBER, USER, SENDER, DATE) 
SELECT 'XXXX', 'XXXX', 'XXXX', 'XXXX'
    FROM DUAL
    WHERE  (SELECT COUNT(*) FROM TABLENAME
                         WHERE MOBILENUMBER = 'XXXX') < 10

【讨论】:

    【解决方案2】:

    你可以这样做:

    DECLARE @cnt INT
    
    SELECT @cnt = COUNT(*) FROM table_name where mobile_number = '".$mobile_number."'
    
    IF @cnt < 10
    
    INSERT INTO table_name VALUES(col1, col2, col3 .....)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多