MySql уникальный идентификатор для нескольких записей - PullRequest
1 голос
/ 11 ноября 2009

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

select max(transaction_id) from users 

и увеличьте это значение на стороне сервера, но оно выглядит как старомодное решение.

Ответы [ 2 ]

2 голосов
/ 11 ноября 2009

У вас может быть другая таблица usergroups с автоинкрементным первичным ключом, вы сначала вставляете туда запись (возможно, включающую некоторую другую полезную информацию о группе). Затем получите уникальный идентификатор группы, сгенерированный во время этой последней вставки, используя mysql_insert_id(), и используйте его в качестве groupid для вставок в первую таблицу.

Таким образом, вы все еще используете автонумерацию MySQL, которая гарантирует вам уникальную groupid. Выполнять select max(transaction_id) from users и увеличивать это небезопасно, поскольку это не атомарное (другой поток мог прочитать то же самое max(transaction_id) до того, как вы изменили его, и начнет вставлять записи с конфликтующим groupid ).

2 голосов
/ 11 ноября 2009

Добавить новую таблицу со столбцом auto_increment

Вы можете создать новую таблицу со столбцом auto_increment. Таким образом, вы сможете генерировать уникальные целые числа потокобезопасным способом. Это будет работать так:

DB::insert_into_transaction_table()
transaction_id = DB::mysql_last_insert_id() ## this is integer value
for each record:
    DB::insert_into_table(transaction_id, ...other parameters...)

И для этого вам не нужны транзакции mysql.

Генерация уникальной строки на стороне сервера перед вставкой

Вы можете создать уникальный идентификатор (например, GUID ) на стороне сервера и использовать его для вставки всех записей. Но ваше полеaction_id должно быть достаточно длинным, чтобы хранить значения, сгенерированные таким образом (некоторые char(...) типа). Это будет работать так:

transaction_id = new_GUID() ## this is usually a string value
for each record:
    DB::insert_into_table(transaction_id, ...other parameters...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...