Я использую PHP и MySQL.
Цель:
Вставьте новую строку в таблицу с автоинкрементным столбцом идентификатора.
При вставке этой новой строки я хотел бы скопировать идентификатор автоинкремента новой вставленной строки # в другой столбец в той же строке/записи.
> После создания новая запись/строка должна иметь автоматически увеличивающийся столбец идентификатора и еще один столбец с тем же номером.
Моя самая большая проблема:
мне нужно, чтобы все это происходило правильно и надежно, даже если на сервере могут выполняться другие транзакции из других подключений.
Уже
Я очень мало знаю о last_insert_id()... и боюсь, что смогу надежно использовать это для своих нужд...
Столкнусь ли я когда-нибудь с ситуацией, когда автоматически увеличивающийся идентификатор # уже будет увеличиваться? (возможно, из-за какого-то другого запроса на вставку из другого соединения), и теперь я не получу правильный идентификатор #? (Я не совсем понял, что это значит, когда last_insert_id() передается клиенту для каждого соединения).
Будет ли last_insert_id() хорошо работать с транзакциями, поскольку они становятся неопределенными, когда транзакция выполняется для отката? (Если произойдет откат другой транзакции, а затем я сразу же запущу этот скрипт, будет ли мой скрипт возвращать NULL для last_insert_id()?)
я не понимаю mysql_insert_id(); как им пользоваться и поможет ли он мне.
До сих пор я думал о:
- ВСТАВИТЬ строку с
column
, установленным как last_insert_id(); - ВСТАВИТЬ строку; ОБНОВЛЕНИЕ
column
с помощью SELECT last_insert_id(); - ВЫБРАТЬ last_insert_id(); ВСТАВЬТЕ строку с
auto-increment column
иcolumn
, установленную как last_insert_id()+1
Что происходит, когда я вставляю выбранное значение в столбец автоинкремента? Начнет ли генератор автоинкремента считать с числа, которое я ввожу? Что, если я использую значение, которое использовалось ранее (но больше не существует), и существуют записи с идентификатором #, которые идут после этого значения?
Позволит ли блокировка таблицы или строки добиться желаемого поведения?
Каков правильный/правильный способ сделать что-то подобное?
"last_insert_id() предоставляется клиенту для каждого соединения"
last_insert_id не зависит от клиента и возвращает идентификатор последней вставленной строки от этого клиента, поэтому вам не нужно беспокоиться о том, что пользователь по другому соединению взаимодействует с базой данных.
Я до сих пор не совсем понимаю, что это значит...
Для базового СЦЕНАРИЯ:
INSERT row where id = 1;
SELECT last_insert_id(); outputs 1
Person A makes a connection to the db; SELECT last_insert_id(); outputs 1.
Person B makes a connection to the db; SELECT last_insert_id(); outputs 1?
Person A INSERT another row where id = 2;
Person A SELECT last_insert_id(); outputs 2?
Person B SELECT last_insert_id(); outputs... 1 or 2??
Что здесь происходит?
И СЦЕНАРИЙ, который меня действительно беспокоит:
Person A makes a connection with the db;
Person A SELECT last_insert_id(); outputs 1
Person A INSERT row where id = 2;
Person A SELECT last_insert_id(); outputs 2
Person B makes a connection with the db;
Person B SELECT last_insert_id(); outputs 2
Person B INSERT row where id = 3;
Person A SELECT last_insert_id(); outputs 2??
Person B SELECT last_insert_id(); outputs 3??
В этом случае last_insert_id() лица А отстает на один счет. Если это правда, то я не смогу использовать свой метод №3.
Пожалуйста, исправьте мои выводы для меня, где я могу ошибаться.