Как получить все идентификаторы строки, созданные одним оператором вставки в несколько строк - PullRequest
2 голосов
/ 28 мая 2010

Я новичок в php. Поэтому, пожалуйста, прости меня, если это кажется глупым вопросом.

Скажите, что у меня есть оператор вставки MySQL insert into table (a,b) values (1,2),(3,4),(5,6). У таблицы 'table' есть поле автоматического увеличения, которое называется 'id'.

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

Будет здорово, если я получу пример, использующий mysqli.

Ответы [ 5 ]

1 голос
/ 26 сентября 2012

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

$SQL = "INSERT INTO Table
       (UserID, Data)
       VALUES
       (1,'Foo'),
       (1,'Bar'),
       (1,'FooBar')";

$Result = mysql_query($SQL);
$LastID = mysql_insert_id();
$RowsAffected = mysql_affected_rows();

$IDSQL = "SELECT RecordID
          FROM Table
          WHERE UserID = 1
          AND RecordID >= '$LastID' 
          LIMIT '$RowsAffected'";
$IDResult = mysql_query($IDSQL);
1 голос
/ 28 мая 2010

Ответ AngeDeLaMort почти правильный. Конечно, наиболее подходящий способ решения этой проблемы - вставлять по одной строке за раз и опрашивать insert_id или генерировать последовательность в другом месте (что имеет дополнительные преимущества с точки зрения масштабируемости).

Я бы настоятельно рекомендовал не пытаться определить последний insert_id и сравнивать его с самым последним insert_id после вставки - просто есть и другие способы, которые не удастся.

Но ... альтернативный подход был бы:

....
"INSERT INTO destn (id, data, other, trans_ref) 
 SELECT id, data, other, connection_id() FROM source";
....
"SELECT id FROM destn WHERE trans_ref=connection_id()";
....
"UPDATE destn SET trans_ref=NULL where trans_ref=connection_id()";

Второй запрос вернет сгенерированные идентификаторы (обратите внимание, что это предполагает, что вы используете одно и то же соединение для всех 3 запросов). Третий запрос необходим, потому что идентификаторы соединения возвращаются в пул при разъединении (то есть используются повторно).

С

1 голос
/ 28 мая 2010

Вы не можете. Я бы посоветовал вам поддерживать свои собственные идентификаторы (используя guid или собственную таблицу автоинкремента) и использовать их при вставке в таблицу.

Но можно получить значение автоинкремента для последней вставки, используя LAST_INSERT_ID ():

http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html

0 голосов
/ 28 мая 2010

Может быть, я смогу сделать это

$insert = "insert into table (a,b) values (1,2),(3,4),(5,6)";
$mysqli->query($insert);
$rows_to_be_inserted=3;
$inserted_id = $mysqli->insert_id // gives me the id of the first row in my list
$last_row_id = ($inserted_id+$rows_to_be_inserted)-1;
$mysql->query("select * from table where id between  $inserted_id and $last_row_id");

что вам, ребята, сказать?

0 голосов
/ 28 мая 2010

как продолжение AngeDeLaMort: Вы можете отделить ваши вставки и сделать это примерно так:

$data = array (
    array(1,2),
    array(3,4),
    array(5,6)
);
$ids = array();

foreach ($data as $item) {
   $sql = 'insert into table (a,b) values ('.$item[0].','.$item[1].')';
   mysql_query ($sql);
   $id[] = mysql_insert_id();
}

Теперь все ваши новые идентификаторы находятся в массиве $ id.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...