我的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等)。
答案 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();
}