2010-12-02 4 views
1

Мне нужно вставить данные в две таблицы: Items и Class_Items. (Третья таблица, классы связаны здесь, но не вставляются).Лучший способ ввести поле автоинкремента INSERT? (PHP/MySQL)

Первичным ключом элементов является Item_ID, и это автоматически увеличивающееся целое число. Помимо этого первичного ключа в элементах нет уникальных полей. Мне нужно знать, что Item_ID соответствует ему классам Class_Items.

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

  • ВСТАВИТЬ каждый элемент, а затем использовать mysql_insert_id(), чтобы получить его ITEM_ID для запроса Class_Items INSERT. Это означает один запрос для каждого элемента (всего запросов на тысячи запросов).
  • Получите следующий идентификатор автоинкремента, затем закройте таблицу Class_Items, чтобы я мог просто добавлять к переменной $ item_id. Это означало бы только два запроса (один для предметов, один для Class_Items)

Какой способ является лучшим и почему? Кроме того, если у вас есть альтернатива, отличная от списка, я открыт для того, что наиболее эффективно.

+2

Если вы регулярно добавляете тысячи предметов, то «стоимость запроса», указанная в первой альтернативе, не будет обычной проблемой; это только укусит вас во время первоначального импорта. Это, очевидно, зависит от вашей конкретной проблемы. – eykanal 2010-12-02 01:24:09

+0

Достаточно справедливо. Мне все еще интересно, что лучше, даже если ставки сейчас не так высоки. В будущем я буду делать сотни тысяч – babonk 2010-12-02 01:28:01

ответ

0

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

Независимо от того, как вы его разрезаете, у вас есть две вставки. Выполнение первого, захват нового значения ID, как вы описали (что накладывает незначительные накладные расходы, потому что значение уже доступно для mysql уже), а его использование во второй вставке довольно минимально.

0

Я бы расследовал использование хранимых процедур и/или транзакций, чтобы убедиться, что ничего плохого не происходит.

0

Я работаю над проектом с MySQL и то, что я сделал следующий (без использования Autoincrement полей):

1- Я создал таблицу, называемую ПОСЛЕДОВАТЕЛЬНОСТЬЮ одним поля типа BIGINT называется VALUE с начальным значение 1. Эта таблица сохранит значение id, которое будет увеличиваться каждый раз при вставке новой записи.

2- Создайте процедуру хранения и обработайте инкремент id внутри нее внутри транзакции.

Вот пример.

CREATE PROCEDURE `SP_registerUser`(

IN _username VARCHAR(40), 
IN _password VARCHAR(40), 

) 
BEGIN 

DECLARE seq_user BIGINT; 

START TRANSACTION; 

#Validate that user does not exist etc.......... 


     #Register the user 
     SELECT value FROM SEQUENCE INTO seq_user; 
     UPDATE SECUENCE SET value = value + 1; 

     INSERT INTO users VALUES(seq_user, _username, SHA1(_password)); 

     INSERT INTO user_info VALUES(seq_user, UTC_TIMESTAMP()); 


COMMIT; 

END // 

В моем случае я хочу, чтобы сохранить идентификатор пользователя в двух разных таблиц (пользователей и user_info)

Смежные вопросы