2016-08-29 20 views
1

我有一個Mysql表,其中pincode字段不能每天重複(Sequential increment id),我也無法應用該字段使用Mysql索引出於某種原因的唯一鍵。PHP - 如何進行插入,直到沒有重複的字段值存在?

使用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 
+1

如何在重複密鑰更新上插入 – Drew

回答

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

在插入之前,您可以創建一個單獨的函數來檢查PIN碼。

例如

​​

如果你得到FALSE響應,則不允許插入新的PIN碼否則,你可以執行INSERT查詢。

讓我知道你是否想要更多的解釋。

相關問題