SQL Вставить строку и скопировать вставленный идентификатор автоинкремента в другой столбец

Я использую PHP и MySQL.

Цель:

Вставьте новую строку в таблицу со столбцом идентификатора с автоинкрементом.
При вставке этой новой строки, я хотел бы скопировать id # автоинкремента новой вставленной строки в другой столбец в той же строке / записи.
После создания новая запись / строка должна иметь столбец идентификатора с автоинкрементом и другой столбец с тем же номером.

Моя самая большая проблема:
Мне нужно, чтобы все это происходило правильно и надежно, даже если на сервере могли происходить другие транзакции из других соединений.

До сих пор

Я знаю лишь немного о last_insert_id () … и боюсь, что смогу надежно использовать это для своих нужд …
Буду ли я когда-нибудь сталкиваться с ситуацией, когда идентификатор # автоинкремента будет уже увеличен (возможно, из-за какого-либо другого запроса вставки из другого соединения), и теперь я не получу правильный идентификатор #? (Я не совсем понял, что это значит, когда last_insert_id () передается клиенту на за соединение).

Будет ли last_insert_id () хорошо играть с транзакциями, поскольку они становятся неопределенными, когда транзакция выполняется для отката? (Если откатывается другая транзакция, а затем я сразу же запускаю этот скрипт, будет ли мой скрипт возвращать NULL для last_insert_id ()?)

Я не понимаю mysql_insert_id (); как использовать это и поможет ли это мне.

До сих пор я думал о:

  1. Вставить строку с column установить как last_insert_id ();
  2. ВСТАВИТЬ строку; ОБНОВИТЬ column с помощью SELECT last_insert_id ();
  3. SELECT 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.


Пожалуйста, исправьте мои выводы для меня, где бы я ни был неправ.

1

Решение

Вы должны проверить Эта статья относительно MySQL last_insert_id

last_insert_id является независимым от клиента и возвращает идентификатор последней вставленной строки от этого клиента, поэтому вам не нужно беспокоиться о случае, когда пользователь, находящийся на другом соединении, осуществляет транзакцию с базой данных.

0

Другие решения

учитывая, что вы можете иметь множественный доступ к вашей БД,

я сделаю:

1, просто вставьте новую строку и положите null в «другой столбец» давайте назовем это [autoID_Copy]

2, тогда я могу запустить это:

update table set autoID_Copy= autoID where autoID_Copy is null

даже сделать это быстрее, вы можете сделать
where timeInstered < 1 min или, может быть, какой-то другой фильтр.

надеюсь, это поможет.

-1