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_ID
、when 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 查询。
如果您想对此进行更多解释,请告诉我。
我有一个 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_ID
、when 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 查询。
如果您想对此进行更多解释,请告诉我。