[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: ON DUPLICATE KEY UPDATE и auto increment
Страницы: 1, 2
acerrusm
Привет!

Есть таблица с колонками:

| user_id | ----- | user_name | ------| user_email |
| 1 | ----- | Ivan | ----- | ivan@mail.rul |

user_id - обозначен как auto increment.
user_email - обозначен как unique

Задача: вставить нового юзера, но предварительно проверить существует ли такой уже в БД. Если существует, то вернуть user_id этого пользователя. Если не существует, то записать его в таблицу и вернуть его user_id.

Мое решение:

public function insertNewUser($userName, $userEmail)
{
self::connectToDB();
$this->sql = "INSERT INTO users (user_name, user_email) VALUES (?, ?) ON DUPLICATE KEY UPDATE user_id=LAST_INSERT_ID(user_id)";

try
{
$this->query = $this->handler->prepare($this->sql);
$this->query->execute(array($userName, $userEmail));
$lastInsertedOrderId = $this->handler->lastInsertId('user_id');

$this->query->closeCursor();
$this->handler = null;

return $lastInsertedOrderId;
}
catch (Exception $e)
{
echo "Error: query failure";
return false;
}
}


В принципе все работает, но в случае если я пытаюсь вставить юзера который существует, то где то "внутри" mysql повышает user_id.

Например: пытаюсь вставить в таблицу пользователя Ivan, ivan@mail.ru (который уже существует) —на выходе получаю его user_id = 1. Проделаю эти манипуляции скажем еще 2 раза — каждый раз получаю user_id = 1 (как и задумано). Но потом вставим нового пользователя Petya, petya@mail.ru. Петя создастся, однако не с user_id = 2, а с user_id = 5.

Почему так происходит, и как избавится от таких ненужных скачков в auto increment?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.