2013-04-10 9 views
5

Есть ли эффективный способ получить все последние вставленные строки с автоматическим добавлением идентификаторов из базы данных mysql с использованием php? Предположим, я не знаю, сколько строк должно быть вставлено в пакет, но мне нужны все их идентификаторы после вставки.Как получить все последние вставленные идентификаторы строк в mysql-php?

После Googling я не нашел эффективного способа сделать это, поэтому я не уверен, что это возможно. Я могу следить за этим, но вам нужно удалять базу данных несколько раз, чтобы получить идентификаторы.

$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); 
    $ids[] = mysql_insert_id(); 
} 

Спасибо

+0

, так что ваш идентификатор является автоматическим приращением – 2013-04-10 07:13:33

+1

что не так? должен работать нормально. – slash197

+3

, прежде чем ваша партия получит максимальный id. после того, как ваша партия получит max id. теперь вы знаете диапазон. – ITroubs

ответ

1

Ваш код близок к полному решению.

$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) or mysql_error(); 
    $ids[] = mysql_insert_id(); 
} 

var_dump($ids); 

Если речь идет о проблеме производительности, то другое решение может быть

foreach ($data as $item) { 
    $sql = "INSERT INTO `table`.`table` (`a`, `b`) VALUES ('{$item[0]}' ,'{$item[1]}');"; 
    mysql_query ($sql) or mysql_error(); 
} 

$last_id = mysql_insert_id(); 
$total = count($data); 
for($i = 0; $i <= $total; $i++){ 
    $ids[] = $total-$i; 
} 

Это позволит предотвратить несколько запросов SQL.

+0

Вы указываете переменную $ ids. Но в любом случае, если ваш идентификатор печати $ id в соответствии с кодом leevi, он должен все идентификаторы. –

+0

@silentboy: ничего плохого на самом деле, как вы говорите, но я просто любопытно, что это будет эффективно ... – leevi

+0

@SureshKamrushi посмотреть код OP. что '$ ids = array()' делать там. он помещает '$ ids' все в массив $ id. это ошибка – 2013-04-10 07:26:01

0

Если auto_incremented поле является «нормальным», так что он не ведет себя каким-то особым образом, но увеличивает последний идентификатор одного, вы можете найти максимальное значение его перед вставкой и затем найдите все записи, которые выше.

Пример:

$sql = "SELECT id FROM table ORDER BY id DESC LIMIT 1"; 
    // get maximal value before insert 

$sql = "SELECT id FROM table WHERE id > :last_id"; // get all new 

Но это решение не очень профессионально.

+2

Будет неточно, если что-либо еще сделает запрос, который вставляется в db - это будет так, если одна и та же страница/запрос была загружена двумя пользователями - если это не является фактором, может работать. Однако в этом случае не просто запустить первый запрос - дважды. 'range ($ firstMax, $ lastMax)' - даст все идентификаторы. И будет работать, даже если диапазон будет огромным числом. – AD7six

+1

Я бы выполнил первый запрос после первой вставки. если вы делаете это для первой вставки, вы сталкиваетесь с огромными проблемами, если кто-то удалит некоторые из последних строк и автоинкремент! = max (id) !! – ITroubs

+0

@ AD7six Да, вы правы. Я не думал о возможности вставки строк из другого источника. – Voitcus

1

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

  1. Вычислить вставленные строки и последний добавленный идентификатор, и вычислить остаток назад.

  2. Создайте пользовательские идентификаторы вместо того, чтобы позволить mysql создавать их поэтапно, и если успех запроса вставки, сохраните идентификатор в массиве (Обычно, если один из них не работает, весь запрос будет терпеть неудачу в любом случае).

Второй метод рекомендуется, так как при n1, если вы делаете slighly сложные операции, например, с помощью INSERT blah blah ON DUPLICATE KEY в модифицирует будет засчитываться как 2 вставки (не спрашивайте меня, почему) вместо одного, и вы должны сделать некоторые вычисления, чтобы увидеть, сколько из них было фактически вставлено и сколько изменено.

Кстати, прекратить использование расширения mysql_, это не рекомендуется, использовать MySQLi или PDO вместо

+0

Спасибо за ваш ответ. Я думаю об эффективном решении с точки зрения автоматического прироста. FYI: Я знаю расширения mysql_ и использую mysqli_ уже в своем действительном коде. Спасибо :) – leevi

+0

Одной из идей было бы добавить дату и время в вставки, получить последнее вложенное id и время, и запросить все идентификаторы с этим datetime. – aleation

-1

Получение идентификатора последней вставки идентификатора

<?php 

$conn = mysql_connect('localhost', 'user', 'password'); 

mysql_select_db('test'); 

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

$ids = array(); 

foreach ($data as $item) { 

    $sql = 'insert into testtable (a,b) values ('.$item[0].','.$item[1].')'; 
    mysql_query ($sql, $conn); 
    $id[] = mysql_insert_id($conn); 
} 
+1

-1 Это похоже на копию кода в вопросе - с опечаткой в ​​нем – AD7six

+0

@ AD7six: Я использовал тот же код, но модифицировал mysql_insert_id ($ conn) вместо mysql_insert_id. Поскольку я новичок в stackoverflow, так что я думал, было бы неплохо поделиться полным примером. Если вы знаете, как поделиться этим примером, пожалуйста, дайте мне знать. –

+0

* [Если идентификатор ссылки не указан, предполагается последняя ссылка, открытая mysql_connect()] (http://php.net/manual/en/function.mysql-insert-id.php) * - то есть добавление ' $ conn' к коду не изменяет, как он работает. Изменение '$ ids' на' $ id' означает, что новая переменная имеет все идентификаторы вместо ожидаемого OP. – AD7six

0

Когда мне нужно отслеживать партии записей, введенных , У меня есть дополнительное поле в таблице, обычно обозначенное как штамп или что-то в этом роде. Когда записи вставляются, поле штампа затем заполняется текущей меткой времени, заданной функцией time(). Затем каждую партию можно отследить, независимо от того, сколько ей лет. Кроме того, сохранение метки времени - это простой способ получить точное время, когда они были добавлены.

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