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

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

Цель:

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

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

Уже

Я очень мало знаю о 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. ВЫБРАТЬ 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.


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


person agent provocateur    schedule 12.02.2015    source источник
comment
Я не уверен, почему вы хотите иметь два столбца, которые всегда будут иметь одно и то же значение, но вы можете сначала вставить, получить последний вставленный идентификатор и обновить таблицу с ним.   -  person Chibuzo    schedule 13.02.2015
comment
@Chibuzo они не ВСЕГДА будут иметь одинаковое значение. как указано, они будут иметь одинаковые значения ВО ВРЕМЯ СОЗДАНИЯ. ничего не упоминалось о том, что происходит с этими полями после создания. Причина, по которой я обеспокоен, заключается в том, что я не уверен, могут ли другие запросы в других соединениях мешать last_inserted_id способом, с которым я не знаком.   -  person agent provocateur    schedule 13.02.2015


Ответы (2)


Вам следует ознакомиться с этой статьей о MySQL last_insert_id

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

person Alex    schedule 12.02.2015
comment
спасибо, но эта статья, похоже, содержит ту же информацию, что и официальная документация (за исключением большего количества примеров?). Я до сих пор не совсем понимаю все последствия того, что другие соединения взаимодействуют с базой данных. Я добавил больше к оригиналу в ответ. - person agent provocateur; 13.02.2015

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

я сделаю:

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

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

update table set autoID_Copy= autoID where autoID_Copy is null 

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

надеюсь на эту помощь.

person Benny Ae    schedule 12.02.2015
comment
если вы не можете (или трудно) получить идентификатор возврата, я предлагаю вам сделать общее обновление, какие записи были недавно вставлены - person Benny Ae; 13.02.2015
comment
но проверьте свои функции выполнения PHP SQL, возможно, вы сможете найти возвращаемое значение. - person Benny Ae; 13.02.2015
comment
извините, но я ничего не понимаю из того, что вы говорите. Я хотел бы знать, КАК вы предлагаете мне получить или вернуть идентификатор. Общий SELECT может получить идентификатор возврата... но что такое (и как сделать) «общее обновление», какие записи были недавно вставлены?? Какие функции выполнения PHP SQL вы упоминаете для проверки? как вы предлагаете мне найти это возвращаемое значение ?? - person agent provocateur; 13.02.2015
comment
общее обновление означает: выполнить обновление без определенного идентификатора. что-то вроде набора обновлений таблицы autoID_Copy = autoID, где autoID_Copy имеет значение null, является общим обновлением, обычно может быть обновлено больше строк. кроме того, конкретное обновление обычно означает только одну строку. например, набор обновлений таблицы autoID_Copy= autoID, где autoID=123 - person Benny Ae; 13.02.2015
comment
Я понимаю что ты имеешь ввиду. Это было бы похоже на мой № 2, только с потенциально большей задержкой, когда этот столбец обновляется до правильного значения. Я хотел бы указать значение столбца как можно скорее, чтобы свести к минимуму время, когда могут произойти другие транзакции. Этим транзакциям потенциально может потребоваться использование этого столбца autoid_copied. - person agent provocateur; 14.02.2015