Я использую PHP и MySQL.
Вставьте новую строку в таблицу со столбцом идентификатора с автоинкрементом.
При вставке этой новой строки, я хотел бы скопировать id # автоинкремента новой вставленной строки в другой столбец в той же строке / записи.
После создания новая запись / строка должна иметь столбец идентификатора с автоинкрементом и другой столбец с тем же номером.
Моя самая большая проблема:
Мне нужно, чтобы все это происходило правильно и надежно, даже если на сервере могли происходить другие транзакции из других соединений.
Я знаю лишь немного о 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 ();auto-increment column
а также column
установить как last_insert_id () + 1Что происходит, когда я вставляю выбранное значение в столбец автоинкремента? Будет ли генератор автоинкремента начинать отсчет с числа, которое я вставил? Что если я использую значение, которое использовалось ранее (но больше не существует) и существуют записи с идентификатором #, которые идут после этого значения?
Позволит ли блокировка таблицы или строки мне достичь желаемого поведения?
Как правильно / правильно сделать что-то подобное?
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.
Пожалуйста, исправьте мои выводы для меня, где бы я ни был неправ.
Вы должны проверить Эта статья относительно MySQL last_insert_id
last_insert_id
является независимым от клиента и возвращает идентификатор последней вставленной строки от этого клиента, поэтому вам не нужно беспокоиться о случае, когда пользователь, находящийся на другом соединении, осуществляет транзакцию с базой данных.
учитывая, что вы можете иметь множественный доступ к вашей БД,
я сделаю:
1, просто вставьте новую строку и положите null
в «другой столбец» давайте назовем это [autoID_Copy]
2, тогда я могу запустить это:
update table set autoID_Copy= autoID where autoID_Copy is null
даже сделать это быстрее, вы можете сделать
where timeInstered < 1 min
или, может быть, какой-то другой фильтр.
надеюсь, это поможет.