PHP - 在不存在重复字段值之前如何进行插入?

PHP - how to make an insert until there is no duplicate field value exist?

我有一个 Mysql table,其中 pincode 字段不能每天重复(顺序递增 ID),我也无法使用 Mysql 索引在该字段上应用唯一键原因。

使用 PHP 我正在尝试如下,但如果我必须通过如下检查它们来不断增加,我的代码将变得无穷无尽。

没有 Mysql 索引从 PHP(zend 框架)做它有没有更好的方法?

$sql = "SELECT count(*) as total 
        FROM  `sh_av_spform` 
        WHERE  DATE(`createdate`) = CURDATE( )";
$result = $db->fetchAll($sql);

if(count($result)>0) {
  $tmp_id = $result[0]['total'] +1;
  $new_id = sprintf('%03d',$tmp_id); // 009

  try{

    $sql1 = "SELECT id,pincode  
        FROM  `sh_av_spform` 
        WHERE  DATE(`createdate`) = CURDATE() and pincode='$new_id' limit 1";  
    $result1 = $db->fetchAll($sql1);
    if(count($result1)>0) {
      // 009 already exist make it 010?
      $tmp_id = $result[0]['total'] +2;
      $new_id = sprintf('%03d', $tmp_id); // 010
    }

    // Ooopsssss! 010 also exist. now what? 
    // keep wrting code forever? or there is better way?
    $db->insert('sh_av_spform', array('pincode'=>$new_id) );// Pincode cant be duplicated

您可以完全在数据库中执行此操作,使用 counter table

示例:

CREATE TABLE daily_pin (day DATE PRIMARY KEY, pin INT UNSIGNED);

START TRANSACTION;
INSERT INTO daily_pin VALUES (CURDATE(),1) ON DUPLICATE KEY UPDATE pin=LAST_INSERT_ID(pin+1);
INSERT INTO table_requiring_pin (pin) VALUES (LPAD(LAST_INSERT_ID(),3,'0'));
COMMIT;

备注:

  • 计数器 table 保存给定日期的最高 PIN。
  • INSERT .. ON DUPLICATE KEY 获得一个新的 pin,如果它是给定日期的第一个条目,则为“1”,或者当前值加 1。
  • LAST_INSERT_IDwhen given an argument、returns 参数并在下次调用 LAST_INSERT_ID 时记住它 而没有 参数。
  • 最后,left pad it with LPAD 得到你想要的“000”格式。

作为此方法的一个附带好处,您可以轻松获得有关引脚使用情况的指标。比如,"what day of the week consumes the most pin?"

您可以创建一个单独的函数来在插入之前检查 PIN 码。

例如

public function ValidatePinCode($PinCode){
     if(isset($PinCode)){
         $SQL=$db->prepare("SELECT pincode FROM `sh_av_spform` WHERE pincode='".$PinCode."'");
         $SQL=$db->execute($SQL);
        if($SQL->fetchColumn()>0){
            $ResponseCode='FALSE';
       }else {
            $ResponseCode='TRUE';
       }
       return $ResponseCode;
    }    
 }

如果您收到 FALSE 响应,则不允许插入新的 PIN 码,否则您可以执行 INSERT 查询。

如果您想对此进行更多解释,请告诉我。