我有一个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
答案 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;
注意:
INSERT .. ON DUPLICATE KEY
获取一个新引脚,如果它是给定日期的第一个条目,则为“1”,或者当前值加1。LAST_INSERT_ID
,when given an argument,返回参数并在下次LAST_INSERT_ID
被称为而不参数时记住它。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查询。
如果您想要更多解释,请告诉我。