Mam tabelę, do której często wstawiane są nowe dane. Muszę zdobyć ostatni identyfikator stołu. Jak mogę to zrobić?
Czy jest podobny do SELECT MAX(id) FROM table?
Mam tabelę, do której często wstawiane są nowe dane. Muszę zdobyć ostatni identyfikator stołu. Jak mogę to zrobić?
Czy jest podobny do SELECT MAX(id) FROM table?
INSERTa zapytaniem MAX(id), możesz otrzymać identyfikator, który nie jest twoim ostatnim identyfikatorem.
Odpowiedzi:
Jeśli używasz PDO, użyj PDO::lastInsertId.
Jeśli używasz Mysqli, użyj mysqli::$insert_id.
Jeśli nadal używasz MySQL:
Proszę nie używać
mysql_*funkcji w nowym kodzie . Nie są już obsługiwane i są oficjalnie przestarzałe . Widzisz czerwone pudełko ? Zamiast tegodowiedz się o przygotowanych wyciągach i korzystaj z PDO lub MySQLi - ten artykuł pomoże Ci zdecydować, które. Jeśli wybierzesz PDO, oto dobry tutorial .
Ale jeśli musisz, użyj mysql_insert_id.
mysql_insert_id zaraz po TWOJEJ mysql_query. Jeśli oczywiście wykonasz kilka innych zapytań na tym samym połączeniu pomiędzy, cóż, nic nie może ci w tym pomóc.
PDOuprzedzeniem, które widzimy wszędzie? Spójrzmy ponownie na porównanie funkcji . Oczywiste jest, że mysqlijest zwycięzcą, gdy musisz ubrudzić sobie ręce rzeczami niskiego poziomu. Innymi słowy, nawet jeśli ktoś wybierze ChNP, w końcu i tak będzie musiał użyć mysqli.
jest funkcja, która wie, jaki był ostatni identyfikator wstawiony w bieżącym połączeniu
mysql_query('INSERT INTO FOO(a) VALUES(\'b\')');
$id = mysql_insert_id();
plus używanie max jest złym pomysłem, ponieważ może to prowadzić do problemów, jeśli twój kod jest używany w tym samym czasie w dwóch różnych sesjach.
Ta funkcja nazywa się mysql_insert_id
W porządku. Możesz również użyć LAST_INSERT_ID ()
select max(id)from tablejest OK?
Z ChNP :
$pdo->lastInsertId();
Z Mysqli :
$mysqli->insert_id;
Proszę nie używać mysql_*funkcji w nowym kodzie . Nie są już obsługiwane i są oficjalnie przestarzałe . Widzisz czerwone pudełko ? Zamiast tegodowiedz się o przygotowanych wyciągach i korzystaj z PDO lub MySQLi - ten artykuł pomoże Ci zdecydować, które. Jeśli wybierzesz PDO, oto dobry tutorial .
To, co napisałeś, dałoby ci najwięcej, idzakładając, że są unikalne i automatycznie zwiększane, co byłoby w porządku, zakładając, że nie przeszkadza ci zapraszanie problemów ze współbieżnością.
Ponieważ używasz MySQL jako bazy danych, istnieje określona funkcja, LAST_INSERT_ID()która działa tylko na bieżącym połączeniu, które wykonało wstawienie.
PHP oferuje specjalną funkcję do tego zwaną mysql_insert_id.
Spróbuj, to powinno działać dobrze:
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
$query = "INSERT blah blah blah...";
$result = mysqli_query($link, $query);
echo mysqli_insert_id($link);
Aby uzyskać ostatnio wstawiony identyfikator w codeigniter Po wykonaniu zapytania wstawiania wystarczy użyć jednej funkcji wywołanej insert_id()w bazie danych, zwróci ona ostatnio wstawiony identyfikator
Dawny:
$this->db->insert('mytable',$data);
echo $this->db->insert_id(); //returns last inserted id
w jednej linii
echo $this->db->insert('mytable',$data)->insert_id();
Możesz uzyskać ostatni wstawiony identyfikator za pomocą wbudowanej funkcji php mysql_insert_id();
$id = mysql_insert_id();
możesz również uzyskać najnowszy identyfikator
$id = last_insert_id();
Można go używać mysql_insert_id(), ale jest jedna szczególna uwaga na temat jego używania, należy go wywołać po wykonaniu zapytania INSERT, czyli w tej samej sesji skryptu. Jeśli go użyjesz w inny sposób, nie będzie działać poprawnie.
UWAGA: jeśli wykonasz wiele operacji wstawiania za pomocą jednej instrukcji, mysqli :: insert_id nie będzie poprawne.
Stół:
create table xyz (id int(11) auto_increment, name varchar(255), primary key(id));
Teraz, jeśli to zrobisz:
insert into xyz (name) values('one'),('two'),('three');
MySqli :: insert_id będzie mieć wartość 1, a nie 3.
Aby uzyskać poprawną wartość, wykonaj:
mysqli::insert_id + mysqli::affected_rows) - 1
To był dokument, ale jest trochę niejasny.
Wolę używać czystej składni MySQL, aby uzyskać ostatni identyfikator auto_increment tabeli, którą chcę.
php mysql_insert_id () i mysql last_insert_id () podają tylko identyfikator ostatniej transakcji.
Jeśli chcesz, aby ostatni identyfikator auto_incremented dowolnej tabeli w Twoim schemacie (nie tylko ostatniej transakcji), możesz użyć tego zapytania
SELECT AUTO_INCREMENT FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'my_database'
AND TABLE_NAME = 'my_table_name';
Otóż to.
Szkoda, że nie widzę odpowiedzi na przykładzie.
Korzystanie z 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
Korzystanie z PDO :: lastInsertId :
$sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
$database->query($sql);
$last_inserted_id=$database->lastInsertId(); // returns last ID
Używając MySQLitransakcji, czasami nie byłem w stanie uzyskać mysqli::$insert_id, ponieważ zwracała 0. Szczególnie jeśli korzystałem z procedur składowanych, które wykonują INSERTs. Jest więc inny sposób w ramach transakcji:
<?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;
}
?>
Użyj mysqli jako depricating 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();
?>
próbowałem
mysqli_insert_id($dbConnectionObj)
Zwraca to ostatnio wstawiony identyfikator bieżącego połączenia, więc jeśli prawidłowo zarządzasz połączeniami, powinno to działać. Przynajmniej dla mnie zadziałało.