Есть ли лучший способ вернуть последний вставленный идентификатор для множественной вставки? - PullRequest
4 голосов
/ 01 августа 2011

Я использую PHP, чтобы добавить 95 новых строк в мою базу данных MySQL и вернуть новый идентификатор строки. Время выполнения занимает около 24 секунд. Если я пройду более 30 секунд, PHP прекратит работу (ограничение по умолчанию 30 секунд).

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

Мое текущее решение таково:

  /* snippets from my class objects to illustrate my code */

  // This foreach takes 24 seconds on just 95 rows
  foreach($list as $row) {
    $id = $this->importRows($sid,$table)

    array_push($id_list,$id);
  }

  /* PDO insertion */
  protected function importRows($row) {
    $sql = "INSERT INTO my_table (name, colour)
            VALUES $row['name'], $row['colour']";

    $result = $this->db->exec($sql);
    return $this->db->lastInsertId();
  }

Чтобы сократить время вставки, я надеюсь, что я могу вставить несколько строк в один запрос В соответствии с MySQL (прокрутите вниз до красной строки и слова ВАЖНО) там написано:

Если вы вставляете несколько строк, используя один оператор INSERT, LAST_INSERT_ID () возвращает значение, сгенерированное для первого вставленного только ряд.

Решение, которое они предлагают, состоит в том, чтобы создать другую таблицу и вставить туда новые идентификаторы, после чего я могу получить новые идентификаторы с помощью оператора select в конце.

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

Ответы [ 2 ]

3 голосов
/ 01 августа 2011

это трюк, который я использовал в следующих случаях:

$query = "INSERT INTO my_table (name, colour) VALUES";
$i = 0;
foreach( $rows as $row ) {
    if( $i ) $query .= ',';
    $query .= " ( $row[ 'name' ],
              IF( @id$i := LAST_INSERT_ID(), $row[ 'colour' ], $row[ 'colour' ] ) )";
    ++$i;
}
$result = $this->db->exec( $query );

затем запрос, подобный этому, для получения идентификаторов:

SELECT @id1, @id2, @id3, ...
0 голосов
/ 01 августа 2011
  1. стол блокировки
  2. добавьте свои данные, используя одну вставку
  3. таблица разблокировки
  4. получить идентификатор последней вставки
  5. другие идентификаторы могут быть вычислены: id[n]=last_insert_id+n, где n - номер вставленной строки
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...