在完整性违规时阻止下一个索引增加

时间:2014-07-16 20:37:31

标签: php mysql pdo dao

我的UserDAO类中有以下方法:

public function insert(Array $params)
{   
    $sql  = 'INSERT INTO users (firstname, lastname, email, password, register_date) ';
    $sql .= 'VALUES(:firstname, :lastname, :email, :password, FROM_UNIXTIME(:register_date))';

    $sth = $this->pdo->prepare($sql);
    $sth->bindValue(':firstname',     $params['firstname'],    \PDO::PARAM_STR);
    $sth->bindValue(':lastname',      $params['lastname'],     \PDO::PARAM_STR);
    $sth->bindValue(':email',         $params['email'],        \PDO::PARAM_STR);
    $sth->bindValue(':password',      $params['password'],     \PDO::PARAM_STR);
    $sth->bindValue(':register_date', $params['registerDate'], \PDO::PARAM_STR);

    return $sth->execute();
}

我的电子邮件列中有UNIQUE约束,所以每当我插入包含重复电子邮件的新记录时,都会抛出异常。这工作正常,但我注意到它仍然增加了下一个主键id,而没有插入任何内容,所以它实际上被跳过了。

如何在这种情况下阻止它增加,以便我仍然可以连续增加索引号? (如1,2,3,4而不是1,3,5,7等)。

2 个答案:

答案 0 :(得分:1)

虽然在表中有一个非连续的id列并不是一个真正的问题,但是如果你担心id s数据类型的限制,你有两个现实的选择。

首先,只需SELECT INSERT检查电子邮件是否存在。

或者使用类似的东西:

INSERT INTO users (firstname, lastname, email, password, register_date)
SELECT :firstname, :lastname, :email, :password, FROM_UNIXTIME(:register_date)
  FROM dual
 WHERE NOT EXISTS (SELECT 1 FROM users WHERE email = :email)

您可以使用返回的行数来检查行是否已INSERT编辑。

答案 1 :(得分:0)

在发送插入查询之前,请检查您是否在数据库中发送了电子邮件。

//...
$sth = $this->pdo->prepare("SELECT count(*) FROM users WHERE email = ?");
$sth->execute(array($params['email']));
$rows = $sth->fetch(PDO::FETCH_NUM);

if ($rows[0]) {
    return $sth->execute();
}

How to get the number of rows grouped by column?