- Можно ли получить id вставленных элементов в mysql одной командой insert?
- 3 ответа 3
- mysql_insert_id
- Описание
- Список параметров
- Возвращаемые значения
- Примеры
- Примечания
- Смотрите также
- User Contributed Notes 12 notes
- PHP MySQL Get Last Inserted ID
- Example (MySQLi Object-oriented)
- Example (MySQLi Procedural)
- Example (PDO)
- Последний добавленный идентификатор PHP MySQL
- Как получить идентификатор последней вставленной строки
- Пример
Можно ли получить id вставленных элементов в mysql одной командой insert?
Использую mysqli в php . При вставке одной записи командой insert , можно получить id вставленной записи. Если же командой insert вставлять несколько записей, то получаю все равно один id первой вставленной записи. Можно ли получить id сразу всех вставленных записей командой insert в mysql ?
3 ответа 3
Ниразу такого не делал, но если бы встала задача, то попробовал бы через цикл вывести mysqli_insert_id начиная с последнего в том количестве id которое было добавлено. Тоесть если добавилось 3 id то сделать цикл, который выводит id с конца 3 штуки.
Особо не пинайте. Для комментов не хватет 2 балла)
Вставка нескольких записей (выполняется из PHP-кода):
Получение id первой из вставленных записей (тоже из PHP-кода, возможно, таким запросом или иным способом):
Допустим, полученный id мы положили в переменную $id. Количество вставленных записей нам известно, допустим, оно находится в переменной $count Теперь надо получить массив id всеx вставленных записей. Это можно попробовать сделать запросом:
SELECT id FROM table WHERE id >= $id ORDER BY id ASC LIMIT $count;
PS. Допускаю, что способ некорректен и может дать неверный результат в многопользовательской среде. Но пока я лично с таким не сталкивался.
В том то и загвоздка, что при параллельных/конкурирующих запросах вставки, нет гарантии необходимого порядка вставки. Хотелось бы более надежный вариант
при параллельных/конкурирующих запросах вставки, нет гарантии необходимого порядка вставки Запрос всегда атомарный. Одиночный запрос — фактически транзакция. А потому надёжность этого варианта если не стопроцентна, то во всяком случае весьма высока. Плюс отсутствие свидетельств (во всяком случае я не видел сообщений о подобном) перемешивания автоинкрементных ID записей, вставленных двумя параллельными запросами.
У mysql нет какого-либо эквивалента insert .. returning , а LAST_INSERT_ID возвращает только один элемент. Поэтому за один запрос — никак, разве только полагаться на детали внутреннего устройства auto_increment .
Имеет смысл не гнаться за одним запросом, а в одной транзакции воспользоваться prepared statement и вставить необходимое число строк.
$dbh->beginTransaction(); $stmt = $dbh->prepare(insert into . ) foreach ($data as $newrow) < $stmt->execute($newrow); $dbh->lastInsertId(); // здесь id доступен и корректен > $dbh->commit();
Что проще по коду нежели собирание одного огромного insert , из-за единой транзакции имеет сопоставимый уровень изоляции видимости и число дисковых операций. Остальные ресурсы необходимо измерять, может быть медленнее, может быть равноценно, может даже быть быстрее одного большого запроса — если за счёт prepared statements получится сэкономить достаточно ресурсов на разборе текста запроса.
mysql_insert_id
Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:
Описание
Возвращает идентификатор, сгенерированный колонкой с AUTO_INCREMENT последним запросом (обычно INSERT).
Список параметров
Соединение MySQL. Если идентификатор соединения не был указан, используется последнее соединение, открытое mysql_connect() . Если такое соединение не было найдено, функция попытается создать таковое, как если бы mysql_connect() была вызвана без параметров. Если соединение не было найдено и не смогло быть создано, генерируется ошибка уровня E_WARNING .
Возвращаемые значения
Идентификатор, сгенерированный колонкой с AUTO_INCREMENT последним запросом в случае успешного выполнения, 0 , если последний запрос не генерирует значение AUTO_INCREMENT value, и false , если соединение MySQL не было установлено.
Примеры
Пример #1 Пример использования mysql_insert_id()
$link = mysql_connect ( ‘localhost’ , ‘mysql_user’ , ‘mysql_password’ );
if (! $link ) die( ‘Ошибка соединения: ‘ . mysql_error ());
>
mysql_select_db ( ‘mydb’ );
?php
mysql_query ( «INSERT INTO mytable (product) values (‘kossu’)» );
printf ( «Идентификатор последней вставленной записи %d\n» , mysql_insert_id ());
?>
Примечания
mysql_insert_id() конвертирует возвращаемый функцией MySQL C API тип значения функции mysql_insert_id() в тип long (называемый int в PHP). Если ваша колонка AUTO_INCREMENT имеет тип BIGINT (64 бита), то значение, возвращаемое функцией в результате преобразования может быть искажено. Используйте вместо данной функции внутреннюю MySQL-функцию LAST_INSERT_ID() в SQL-запросе. Подробнее о максимальных значениях целых чисел смотрите в разделе документации, посвящённом целым числам.
Замечание:
Так как mysql_insert_id() работает с последним выполненным запросом, вызывайте mysql_insert_id() сразу же после запроса, генерирующего новое значение.
Замечание:
Значение в SQL функции MySQL LAST_INSERT_ID() всегда содержит последний сгенерированный ID и не обнуляется между запросами.
Смотрите также
User Contributed Notes 12 notes
There’s nothing inherently wrong with using auto-increment fields. There’s also nothing wrong with the main competetive idea, which is for the database to supply a primitive sequence of non-repeating identifiers, typically integers. This is rather like which side of the road you drive on.
The bigger problem is when people don’t understand what they are doing with database access. It’s like driving a car without really knowing the rules of the road. Such people wind up making bad decisions without realizing it, and then, eventually, something breaks.
Databases are complex beasts, and worth taking the time to really understand. Learn about the implications and limitations of different approaches to solving problems. Then, you will be prepared to pick a solution based on what has to work.
Forget about using MAX to get the last inserted id. Race conditions like other users inserting between your SELECT MAX(.. and your INSERT may render your id unusable.
The WAY to get the id is by using mysql_insert_id() or the mysql SQL function LAST_INSERT_ID().
Take care, if using mysql_insert_id() you should provide the resource returned by the mysql_connect, not the resultset returned by mysql_query.
I don’t get all the fuss around this.
I read:
«The value of mysql_insert_id() is affected only by statements issued within the current client connection. It is not affected by statements issued by other clients.»
I can’t really see what’s inaccurate about that.
«In the case of a multiple-row INSERT statement, mysql_insert_id() returns the first automatically generated AUTO_INCREMENT value; if no such value is generated, it returns the last last explicit value inserted into the AUTO_INCREMENT column.»
I must be missing something here but why would you insert multiple rows and then only handle the last one with some favoured behaviour? You could just as well insert them one at a time and then handle each row separately with the latest id.
I can’t see what’s wrong with that.
However I can see what’s wrong with simply using max(my_table.id_column) because of the concurrent access issues this would imply.
I thought this would be relevant to all the people using mysqli and looking for the ID after INSERT command :
function insert_join ( $catid , $disc_id ) // insert a new item into the database
$conn = db_connect ();
// insert new item
$demande = «insert into categories_disc values (», ‘» . $catid . «‘, ‘» . $disc_id . «‘)» ;
$resultat = $conn -> query ( $demande );
if (! $resultat ) return false ;
> else return $conn -> insert_id ; // function will now return the ID instead of true.
>
>
?>
Then, on the other side, let us call this function as follows :
$cat_id = insert_join ( $catid , $disc_id );
if( $cat_id !== false )
echo «
Category stuff was added to the database as follows :
» ;
echo «
ID de la category : » . $cat_id . «
» ;
Take care of setting an empty value for the AUTO_INCREMENT Field else you never get a value except zero returned from mysq_insert_id() .
PHP MySQL Get Last Inserted ID
If we perform an INSERT or UPDATE on a table with an AUTO_INCREMENT field, we can get the ID of the last inserted/updated record immediately.
In the table «MyGuests», the «id» column is an AUTO_INCREMENT field:
CREATE TABLE MyGuests (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
firstname VARCHAR(30) NOT NULL,
lastname VARCHAR(30) NOT NULL,
email VARCHAR(50),
reg_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
The following examples are equal to the examples from the previous page (PHP Insert Data Into MySQL), except that we have added one single line of code to retrieve the ID of the last inserted record. We also echo the last inserted ID:
Example (MySQLi Object-oriented)
$servername = «localhost»;
$username = «username»;
$password = «password»;
$dbname = «myDB»;
?php
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) die(«Connection failed: » . $conn->connect_error);
>
$sql = «INSERT INTO MyGuests (firstname, lastname, email)
VALUES (‘John’, ‘Doe’, ‘john@example.com’)»;
if ($conn->query($sql) === TRUE) $last_id = $conn->insert_id;
echo «New record created successfully. Last inserted ID is: » . $last_id;
> else echo «Error: » . $sql . «
» . $conn->error;
>
Example (MySQLi Procedural)
$servername = «localhost»;
$username = «username»;
$password = «password»;
$dbname = «myDB»;
?php
// Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);
// Check connection
if (!$conn) die(«Connection failed: » . mysqli_connect_error());
>
$sql = «INSERT INTO MyGuests (firstname, lastname, email)
VALUES (‘John’, ‘Doe’, ‘john@example.com’)»;
if (mysqli_query($conn, $sql)) $last_id = mysqli_insert_id($conn);
echo «New record created successfully. Last inserted ID is: » . $last_id;
> else echo «Error: » . $sql . «
» . mysqli_error($conn);
>
Example (PDO)
$servername = «localhost»;
$username = «username»;
$password = «password»;
$dbname = «myDBPDO»;
?php
try $conn = new PDO(«mysql:host=$servername;dbname=$dbname», $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = «INSERT INTO MyGuests (firstname, lastname, email)
VALUES (‘John’, ‘Doe’, ‘john@example.com’)»;
// use exec() because no results are returned
$conn->exec($sql);
$last_id = $conn->lastInsertId();
echo «New record created successfully. Last inserted ID is: » . $last_id;
> catch(PDOException $e) echo $sql . «
» . $e->getMessage();
>
Последний добавленный идентификатор PHP MySQL
В этом уроке вы узнаете, как получить уникальный идентификатор последней вставленной строки из таблицы базы данных MySQL с помощью PHP.
Как получить идентификатор последней вставленной строки
В уроке о вставка данных в таблицу БД MySQL мы узнали, что MySQL автоматически генерирует уникальный идентификатор для столбца с атрибутом AUTO_INCREMENT каждый раз, когда мы вставляем новую запись или строку в таблицу. Однако бывают ситуации, когда нам нужен автоматически сгенерированный идентификатор, чтобы вставить его во вторую таблицу. В этих ситуациях мы можем использовать функцию PHP mysqli_insert_id() для получения последнего сгенерированного идентификатора.
В следующем примере мы будем использовать ту же таблицу persons, которую мы создали в уроке создание таблиц PHP MySQL, которая имеет четыре столбца id, first_name, last_name и email, где id — столбец первичного ключа с атрибутом AUTO_INCREMENT .
Пример
// Попытка выполнения запроса вставки $sql = "INSERT INTO persons (first_name, last_name, email) VALUES ('Ron', 'Weasley', 'ronweasley@mail.com')"; if(mysqli_query($link, $sql)) < // Получить последний вставленный идентификатор $last_id = mysqli_insert_id($link); echo "Записи успешно вставлены. Последний вставленный идентификатор: " . $last_id; >else < echo "Ошибка вставки $sql. " . mysqli_error($link); >// Закрыть соединение mysqli_close($link); ?>
connect_error); > // Попытка выполнения запроса вставки $sql = "INSERT INTO persons (first_name, last_name, email) VALUES ('Ron', 'Weasley', 'ronweasley@mail.com')"; if($mysqli->query($sql) === true)< // Получить последний вставленный идентификатор $last_id = $mysqli->insert_id; echo "Записи успешно вставлены. Последний вставленный идентификатор: " . $last_id; > else< echo "Ошибка вставки $sql. " . $mysqli->error; > // Закрыть соединение $mysqli->close(); ?>
setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); > catch(PDOException $e)< die("Ошибка подключения. " . $e->getMessage()); > // Попытка выполнения запроса вставки try< $sql = "INSERT INTO persons (first_name, last_name, email) VALUES ('Ron', 'Weasley', 'ronweasley@mail.com')"; $pdo->exec($sql); $last_id = $pdo->lastInsertId(); echo "Записи успешно вставлены. Последний вставленный идентификатор: " . $last_id; > catch(PDOException $e)< die("Ошибка вставки $sql. " . $e->getMessage()); > // Закрыть соединение unset($pdo); ?>