Есть ли эффективный способ извлечения всех последних вставленных строк автоматически увеличивающихся идентификаторов из базы данных 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(); }
Спасибо
ваш код близок к полному решению.
$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.
Mysql возвращает только последний вставленный id, к сожалению, нет способа получить все из них (прямо). Вам нужно будет использовать работу, например:
Вычислите вставленные строки и последний вставленный идентификатор и вычислите остальную часть назад.
Создавайте пользовательские идентификаторы вместо того, чтобы позволить mysql создавать их поэтапно, и если успех запроса вставки хранит идентификатор в массив (обычно, если один из них терпит неудачу, весь запрос будет терпеть неудачу в любом случае).
Второй метод рекомендуется, так как с n1, если вы выполняете сложные операции, например, используя INSERT blah blah ON DUPLICATE KEY
модификации будут считаться 2 вставками (не спрашивайте меня, почему) вместо одного, и вам нужно сделайте некоторые расчеты, чтобы увидеть, сколько из них было фактически вставлено и сколько было изменено.
Кстати, перестань использовать расширение mysql_, оно устарело, используйте mysqli или pdo вместо
Если ваше поле auto_incremented является «нормальным», поэтому оно не ведет себя каким-то особым образом, но увеличивает последний id на единицу, вы можете найти максимальное его значение перед вставкой, а затем найти все записи, которые выше.
Пример:
$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
Но это решение не так уж и профессионально.
Когда мне нужно отслеживать партии введенных записей, у меня есть дополнительное поле в таблице, обычно обозначенное как штамп или что-то в этом роде. Когда записи вставляются, поле штампа затем заполняется текущей меткой времени, заданной функцией time (). Затем каждую партию можно отследить, независимо от того, сколько ей лет. Кроме того, сохранение метки времени – это простой способ получить точное время, когда они были добавлены.
Получение идентификатора последнего идентификатора вставки
<?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); }