PHP - MySQL - INSERT in循环,双重条目

时间:2014-10-20 21:09:23

标签: php mysql

我有一个非常简单的循环,出于某种原因,我在数据库中看到了双重条目。简单的代码在下面,1000个INSERT查询中有1个或2个,我看到双重条目。我不知道为什么会这样。是否有任何MySQL设置或任何导致INSERT查询延迟的事情,并且该延迟会阻止SELECT控件错过它?

for($i = 0; $i < 1000; $i++) {
    $query = mysql_query("SELECT * FROM Table1 WHERE Field1 = '".$i."'");
    if(!mysql_num_rows($query) > 0) {
        $insert = mysql_query("INSERT INTO Table1 SET Field1 = '".$i."'");
    }
}

1 个答案:

答案 0 :(得分:1)

http://www.tutorialspoint.com/mysql/mysql-handling-duplicates.htm

CREATE TABLE Table1
(
   // your columns and definitions
   PRIMARY_KEY(Field1)  // or UNIQUE(Field1)
);

之后,插入忽略由于重复导致的可能错误(没有消息,mysql将继续其工作)..

for($i = 0; $i < 1000; $i++) {
   mysql_query("INSERT IGNORE INTO Table1 SET Field1 = '$i'");
}

ps:不要使用mysql_扩展名 - 它已经过时了,使用mysqli_它允许使用预准备语句,这样可以在查询准备好后只使数据更容易让MySQL的生活和生活更轻松在循环中发送 - http://php.net/manual/en/mysqli.quickstart.prepared-statements.php

像这样(可以写得更短,删除所有检查)

// setup connection to DB

/* Prepared statement, stage 1: prepare */
if (!($stmt = $mysqli->prepare("INSERT IGNORE INTO Table1 SET Field1 = (?)")))
{
     echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
}

/* Prepared statement, stage 2: bind and execute */
$id = 1;
if (!$stmt->bind_param("i", $id)) {
    echo "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error;
}

if (!$stmt->execute()) {
    echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
}

/* Prepared statement: repeated execution,
   only data transferred from client to server */
for ($id = 2; $id < 1000; $id++) {
    if (!$stmt->execute()) {
        echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
    }
}

/* explicit close recommended */
$stmt->close();

它看起来更长,但发送到数据库的数据更少,从而减少了负载。