2010-09-14 3 views
3

Я хочу использовать PHP и MySQL для вставки данных в таблицу данных и связанную с ней таблицу «многие ко многим». Автоматически увеличивающий первичный идентификатор таблицы данных используется во многих таблицах. Поэтому мне нужно знать идентификаторы таблицы данных для вставки в таблицу «многие ко многим».Использование mysql_insert_id для вставки большого количества данных

Мое настоящее мышление заключается в том, что лучший способ приблизиться к этому - это цикл, который сначала будет вставляться в таблицу данных, а затем использовать mysql_insert_id() для вставки в таблицу «многие ко многим». Это лучший способ сделать это?

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

+1

Где эти данные поступают из того, что вы хотите вставить? Это может помочь определить, с какими типами запросов мы можем работать с –

+1

'mysql_insert_id()' не вернет последний идентификатор вставки последнего потока, поэтому ваш подход будет безопасен с несколькими процессами. – staticsan

ответ

3

Вызов mysql_insert_id() на стол с идентификатором auto_increment - это точно правильный подход.

Пока вы вызываете mysql_insert_id() сразу после того, как вы вызываете mysql_query(), чтобы вставить строку, вам не нужно беспокоиться о том, чтобы получить неправильный идентификатор. PHP и MySQL ухаживают за всем этим для вас.

-3

Если вы можете просто заблокировать стол.

LOCK TABLE myTable FOR WRITE; 
SELECT MAX(id) FROM myTable; 
INSERT.... 
INSERT.... 
INSERT.... 
SELECT MAX(id) FROM myTable; 
UNLOCK TABLES; 

Это предотвратит кого-либо еще делать что-либо с MYTABLE, но будет иметь минимальную/максимальную дальность стрельбы для ваших идентификаторов.

-daniel

+0

-1: a) mysql_insert_id уже потокобезопасен, как указал Гас и Статиксан. б) Это будет свист или без причины. Вопрос подразумевает многопоточный доступ. c) Использование MAX (id) - плохая идея. Хотя автоинкрементный идентификатор часто определяется как MAX (столбец) +1, например, в MyISAM, вы не должны полагаться на него по причинам мобильности. d) Вопрос подразумевает, что результат для каждой вставки необходим, а не только последняя вставка. – EboMike

+0

b) Таблицы могут быть заблокированы в течение коротких периодов времени. c) Да, MAX (id) - плохая идея относительно портабельности, но кто изменяет базы данных? Это редкое событие. d) Результатом является все вставленные значения с начала SELECT MAX (id) до конца SELECT MAX (id). – Daniel

+1

-1: на себе. Я должен был внимательно прочитать вопрос. :) – Daniel