PHP - 如何存在插入,直到没有重复的字段值存在?

时间:2016-08-29 17:51:24

标签: php mysql zend-framework

我有一个Mysql表,其中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

2 个答案:

答案 0 :(得分:1)

您可以使用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;

注意:

  • 计数器表保持给定日期最高尚未使用的PIN。
  • INSERT .. ON DUPLICATE KEY获取一个新引脚,如果它是给定日期的第一个条目,则为“1”,或者当前值加1。
  • LAST_INSERT_IDwhen given an argument,返回参数并在下次LAST_INSERT_ID被称为而不参数时记住它。
  • 最后,left pad it with LPAD获取您想要的“000”格式。

作为此方法的一个附带好处,您可以轻松获得引脚使用情况的指标。比如,“一周中的哪一天消耗最多的针脚?”

答案 1 :(得分:1)

您可以在插入之前创建一个单独的函数来检查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查询。

如果您想要更多解释,请告诉我。