У мене є таблиця, до якої часто вставляються нові дані. Мені потрібно отримати останній ідентифікатор таблиці. Як я можу це зробити?
Це схоже на SELECT MAX(id) FROM table?
У мене є таблиця, до якої часто вставляються нові дані. Мені потрібно отримати останній ідентифікатор таблиці. Як я можу це зробити?
Це схоже на SELECT MAX(id) FROM table?
INSERTта запитом для MAX(id), ви можете отримати ідентифікатор, який не є вашим останнім ідентифікатором.
Відповіді:
Якщо ви використовуєте PDO, використовуйте PDO::lastInsertId.
Якщо ви використовуєте Mysqli, використовуйте mysqli::$insert_id.
Якщо ви все ще використовуєте Mysql:
Будь ласка, не використовуйте
mysql_*функції в новому коді . Вони більше не підтримуються і офіційно застаріли . Бачите червоне поле ? Дізнайтесянатомістьпро підготовлені твердження та використовуйте PDO або MySQLi - ця стаття допоможе вам вирішити, які. Якщо ви вибрали PDO, ось хороший підручник .
Але якщо доведеться, використовуйте mysql_insert_id.
mysql_insert_id відразу після вашого mysql_query. Якщо, звичайно, ви виконуєте кілька інших запитів за тим самим підключенням між ними, ну, там нічого не може вам допомогти.
PDOупередженістю, яку ми бачимо скрізь? Давайте знову подивимося на порівняння функцій . Зрозуміло, що mysqliце переможець, коли вам потрібно забруднити руки нечистими речами. Іншими словами, навіть якщо хтось обирає ЗНП, він зрештою все mysqliодно потребуватиме використання .
є функція, яка знає, який останній ідентифікатор був вставлений у поточне з'єднання
mysql_query('INSERT INTO FOO(a) VALUES(\'b\')');
$id = mysql_insert_id();
плюс використання max - це погана ідея, оскільки це може призвести до проблем, якщо ваш код використовується одночасно в двох різних сесіях.
Ця функція називається mysql_insert_id
Нічого страшного. Також ви можете використовувати LAST_INSERT_ID ()
select max(id)from tableце нормально?
З PDO :
$pdo->lastInsertId();
З Mysqli :
$mysqli->insert_id;
Будь ласка, не використовуйте mysql_*функції в новому коді . Вони більше не підтримуються і офіційно застаріли . Бачите червоне поле ? Дізнайтесянатомістьпро підготовлені твердження та використовуйте PDO або MySQLi - ця стаття допоможе вам вирішити, які. Якщо ви вибрали PDO, ось хороший підручник .
Те, що ви написали, принесло б вам найбільше idприпущення, що вони були унікальними та автоматично збільшувались, що було б непогано, якщо ви гаразд запрошуєте проблеми з паралельністю.
Оскільки ви використовуєте MySQL як базу даних, існує конкретна функція, LAST_INSERT_ID()яка працює лише на поточному з'єднанні, яке здійснило вставку.
PHP пропонує спеціальну функцію для того, що називається mysql_insert_id.
Спробуйте, це має працювати нормально:
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
$query = "INSERT blah blah blah...";
$result = mysqli_query($link, $query);
echo mysqli_insert_id($link);
Ви можете отримати останній вставлений ідентифікатор за допомогою вбудованої функції php mysql_insert_id();
$id = mysql_insert_id();
Ви також отримаєте останній ідентифікатор
$id = last_insert_id();
Отримання останнього вставленого ідентифікатора в codeigniter Після виконання запиту на вставку просто використовуйте одну функцію, що викликається insert_id()в базі даних, вона поверне останній вставлений ідентифікатор
Приклад:
$this->db->insert('mytable',$data);
echo $this->db->insert_id(); //returns last inserted id
в один рядок
echo $this->db->insert('mytable',$data)->insert_id();
Це нормально використовувати mysql_insert_id(), але є одна конкретна примітка щодо його використання, ви повинні викликати його після виконаного запиту INSERT, означає в тому ж сеансі сценарію. Якщо ви використовуєте його в іншому випадку, це буде працювати неправильно.
ПРИМІТКА: якщо ви зробите кілька встав з одним оператором mysqli :: insert_id, буде неправильним.
Стіл:
create table xyz (id int(11) auto_increment, name varchar(255), primary key(id));
Тепер, якщо ви це зробите:
insert into xyz (name) values('one'),('two'),('three');
Mysqli :: insert_id буде 1, а не 3.
Щоб отримати правильне значення:
mysqli::insert_id + mysqli::affected_rows) - 1
Це був документ, але трохи неясний.
Я вважаю за краще використовувати чистий синтаксис MySQL, щоб отримати останній ідентифікатор auto_increment таблиці, яку я хочу.
php mysql_insert_id () та mysql last_insert_id () дають лише ідентифікатор останньої транзакції.
Якщо вам потрібен останній автоматично_інкрементований ідентифікатор будь-якої таблиці у вашій схемі (не тільки останньої транзакції), ви можете використовувати цей запит
SELECT AUTO_INCREMENT FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'my_database'
AND TABLE_NAME = 'my_table_name';
Це воно.
Сумно не бачити відповідей на прикладі.
Використання Mysqli :: $ insert_id :
$sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
$mysqli->query($sql);
$last_inserted_id=$mysqli->insert_id; // returns last ID
Використання PDO :: lastInsertId :
$sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
$database->query($sql);
$last_inserted_id=$database->lastInsertId(); // returns last ID
Використовуючи MySQLiтранзакцію, я іноді не міг отримати mysqli::$insert_id, оскільки вона повертала 0. Особливо, якщо я використовував збережені процедури, які виконували INSERTs. Отже, є ще один спосіб у транзакції:
<?php
function getInsertId(mysqli &$instance, $enforceQuery = false){
if(!$enforceQuery)return $instance->insert_id;
$result = $instance->query('SELECT LAST_INSERT_ID();');
if($instance->errno)return false;
list($buffer) = $result->fetch_row();
$result->free();
unset($result);
return $buffer;
}
?>
Використовуйте mysqli, оскільки mysql зображує
<?php
$mysqli = new mysqli("localhost", "yourUsername", "yourPassword", "yourDB");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
// Conside employee table with id,name,designation
$query = "INSERT INTO myCity VALUES (NULL, 'Ram', 'Developer')";
$mysqli->query($query);
printf ("New Record has id %d.\n", $mysqli->insert_id);
/* close connection */
$mysqli->close();
?>
я намагався
mysqli_insert_id ($ dbConnectionObj)
Це повертає останній вставлений ідентифікатор поточного з'єднання, тому, якщо ви належним чином керуєте своїми з'єднаннями, це повинно працювати. Працював у мене принаймні.
Під час усього цього обговорення я припускаю, що причина перевірки максимального ідентифікатора полягає в тому, щоб знати, який ідентифікатор повинен бути наступним .. (якщо мій максимальний ідентифікатор - 5, то наступним буде 5 + 1 = 6).
>> Якщо це не причина, найкращі вибачення
Випадок, якщо хтось інший ВСТАВЛЯЄ інформацію між вашим ПЕРЕВІРКОМ та ВСТАВКОЮ, це дасть вам неправильний ідентифікатор.
Тож це можна вирішити, якщо ви створили хеш, який міг би містити позначку часу або інше унікальне значення.
Тоді в тій самій функції ви можете вставити свою інформацію з порожніми значеннями та ваш хеш. Це створило б ідентифікатор, якщо ви вибрали AUTO_INCRECEMENT.
Тоді в тій самій функції у вас все одно буде ваш хеш, і ви можете шукати ідентифікатор з тим самим хешем. А потім ви можете заповнити порожні значення за допомогою mysql UPDATE.
Це включає в себе трохи більше з'єднань, але це все одно спосіб зробити це ...
Удачі у її вирішенні.
Якщо у вашій таблиці є стовпець AUTO INCREMENT, такий як UserID, Emp_ID, .., тоді ви можете використовувати цей запит, щоб отримати останній вставлений запис SELECT * FROM ім'я_таблиці, де UserID = (виберіть MAX (UserID) з table_name) У коді PHP:
$con = mysqli_connect('localhost', 'userid', 'password', 'database_name');
if (!$con) {
die('Could not connect: ' . mysqli_error($con));
}
$sql = "SELECT * FROM table_name where UserID=(select MAX(UserID)from table_name)";
$result = mysqli_query($con, $sql);
Тоді ви можете використовувати отримані дані як свою вимогу
mysql_query("INSERT INTO mytable (product) values ('kossu')");
printf("Last inserted record has id %d\n", ***mysql_insert_id()***);