Лучший способ ВСТАВИТЬ поле автоинкремента? (PHP / MySQL) - PullRequest
1 голос
/ 02 декабря 2010

Мне нужно вставить данные в две таблицы: Items и Class_Items.(Третья таблица, Classes связана здесь, но не вставляется в нее).

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

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

  • Вставьте каждый элемент, затем используйте mysql_insert_id (), чтобы получить его Item_ID для запроса INSERT Class_Items.Это означает один запрос для каждого элемента (всего тысяч запросов).
  • Получите следующий идентификатор автоинкремента, затем ЗАБЛОКИРУЙТЕ таблицу Class_Items, чтобы я мог просто продолжать добавлять переменную $ item_id.Это будет означать всего два запроса (один для Предметов, один для Классовых Элементов)

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

Ответы [ 3 ]

0 голосов
/ 02 декабря 2010

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

1- Я создал таблицу с именем SEQUENCE с одним полем типа BIGINT с именем VALUE сначальное значение 1. В этой таблице будет храниться значение идентификатора, которое будет увеличиваться при каждом добавлении новой записи.

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

Вот пример.

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 //

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

0 голосов
/ 02 декабря 2010

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

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

0 голосов
/ 02 декабря 2010

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

...