So erhalten Sie die nächste ID in MySQL, um sie in die Tabelle einzufügen
INSERT INTO payments (date, item, method, payment_code)
VALUES (NOW(), '1 Month', 'paypal', CONCAT("sahf4d2fdd45", id))
So erhalten Sie die nächste ID in MySQL, um sie in die Tabelle einzufügen
INSERT INTO payments (date, item, method, payment_code)
VALUES (NOW(), '1 Month', 'paypal', CONCAT("sahf4d2fdd45", id))
Antworten:
Verwendung LAST_INSERT_ID()
aus Ihrer SQL-Abfrage.
Oder
Sie können es auch verwenden mysql_insert_id()
, um es mit PHP zu bekommen.
LAST_INSERT_ID()
.
mysqli_insert_id
Sie können verwenden
SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'table_name'
AND table_schema = DATABASE( ) ;
oder wenn Sie information_schema nicht verwenden möchten, können Sie dies verwenden
SHOW TABLE STATUS LIKE 'table_name'
TABLES.AUTO_INCREMENT
wird zwischengespeichert dev.mysql.com/doc/refman/8.0/en/… . MySQL-Blog hat auch mehrere Beiträge darüber, aber die Systemvariable, die sie erwähnen, scheint veraltet zu sein: mysqlserverteam.com/… mysqlserverteam.com/…
Sie können den nächsten Wert für die automatische Inkrementierung erhalten, indem Sie Folgendes tun:
SHOW TABLE STATUS FROM tablename LIKE Auto_increment
/*or*/
SELECT `auto_increment` FROM INFORMATION_SCHEMA.TABLES
WHERE table_name = 'tablename'
Beachten Sie, dass Sie dies nicht zum Ändern der Tabelle verwenden sollten. Verwenden Sie stattdessen eine Spalte auto_increment, um dies automatisch zu tun.
Das Problem ist, dass last_insert_id()
es rückwirkend ist und somit innerhalb der aktuellen Verbindung garantiert werden kann.
Dieses Baby ist prospektiv und daher nicht pro Verbindung einzigartig und kann nicht als verlässlich angesehen werden.
Nur in einer einzigen Verbindungsdatenbank würde es funktionieren, aber einzelne Verbindungsdatenbanken haben heute die Angewohnheit, morgen mehrere Verbindungsdatenbanken zu werden.
Sehen: SHOW TABLE STATUS
insert into table_name (field1, field2) select 'constant', auto_increment from information_schema.tables where table_name = 'table_name'
? Ich würde die Aktualisierung im after insert
Trigger verwenden und last_insert_id()
obwohl ...
UPDATE
wenn ich auch hätte. Aber ich möchte die beiden lieber zur Anzeigezeit verketten und den ganzen Ärger sparen.
SHOW TABLE STATUS
erwartet database name
nach FROM
und 'table name pattern'
nach zu sehen LIKE
.
Dies gibt den automatischen Inkrementwert für die MySQL-Datenbank zurück und ich habe nicht mit anderen Datenbanken nachgefragt. Beachten Sie, dass bei Verwendung einer anderen Datenbank die Abfragesyntax möglicherweise anders ist.
SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'your_table_name'
and table_schema = 'your_database_name';
SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'your_table_name'
and table_schema = database();
Die Top-Antwort verwendet PHP MySQL_ für eine Lösung. Ich dachte, ich würde eine aktualisierte PHP MySQLi_- Lösung verwenden, um dies zu erreichen. In diesem Beispiel gibt es keine Fehlerausgabe!
$db = new mysqli('localhost', 'user', 'pass', 'database');
$sql = "SHOW TABLE STATUS LIKE 'table'";
$result=$db->query($sql);
$row = $result->fetch_assoc();
echo $row['Auto_increment'];
Startet das nächste Auto-Inkrement, das in einer Tabelle angezeigt wird.
In PHP können Sie dies versuchen:
$query = mysql_query("SELECT MAX(id) FROM `your_table_name`");
$results = mysql_fetch_array($query);
$cur_auto_id = $results['MAX(id)'] + 1;
ODER
$result = mysql_query("SHOW TABLE STATUS WHERE `Name` = 'your_table_name'");
$data = mysql_fetch_assoc($result);
$next_increment = $data['Auto_increment'];
Lösung:
CREATE TRIGGER `IdTrigger` BEFORE INSERT ON `payments`
FOR EACH ROW
BEGIN
SELECT AUTO_INCREMENT Into @xId
FROM information_schema.tables
WHERE
Table_SCHEMA ="DataBaseName" AND
table_name = "payments";
SET NEW.`payment_code` = CONCAT("sahf4d2fdd45",@xId);
END;
"DataBaseName" ist der Name unserer Datenbank
Sie können den MySQL-Trigger verwenden
payment_code
im after insert
Trigger scheint die beste Option zu sein.
Sie können die ID beim Einfügen nicht verwenden und benötigen sie auch nicht. MySQL kennt die ID nicht einmal, wenn Sie diesen Datensatz einfügen. Sie können einfach "sahf4d2fdd45"
in der payment_code
Tabelle speichern id
und payment_code
später verwenden.
Wenn Sie Ihren Zahlungscode wirklich benötigen, um die ID zu enthalten, aktualisieren Sie die Zeile nach dem Einfügen, um die ID hinzuzufügen.
information_schema.tables
Tabelle aufgeführt ist.
SELECT ... CONCAT(payment_code, id)
oder in Ihrem Anwendungscode. Sie können das sogar SELECT
in ein VIEW
einpacken, sodass Sie immer den richtigen Wert zurückgeben, ohne sich bei jedem SELECT Ihrer App um das CONCAT kümmern zu müssen.
Wofür benötigen Sie die nächste inkrementelle ID?
MySQL erlaubt nur ein Auto-Inkrement-Feld pro Tabelle und muss auch der Primärschlüssel sein, um die Eindeutigkeit zu gewährleisten.
Beachten Sie, dass die nächste Einfügungs-ID bei Verwendung möglicherweise nicht verfügbar ist, wenn Sie sie verwenden, da der Wert, den Sie haben, nur im Rahmen dieser Transaktion liegt. Abhängig von der Auslastung Ihrer Datenbank wird dieser Wert möglicherweise bereits zum Zeitpunkt der nächsten Anforderung verwendet.
Ich würde vorschlagen, dass Sie Ihr Design überprüfen, um sicherzustellen, dass Sie nicht wissen müssen, welcher Wert für die automatische Inkrementierung als Nächstes zugewiesen werden soll
Ich schlage vor, zu überdenken, was Sie tun. Ich habe noch nie einen einzigen Anwendungsfall erlebt, in dem dieses spezielle Wissen erforderlich ist. Die nächste ID ist ein ganz besonderes Implementierungsdetail, und ich würde nicht damit rechnen, dass sie ACID-sicher ist.
Führen Sie eine einfache Transaktion durch, bei der Ihre eingefügte Zeile mit der letzten ID aktualisiert wird:
BEGIN;
INSERT INTO payments (date, item, method)
VALUES (NOW(), '1 Month', 'paypal');
UPDATE payments SET payment_code = CONCAT("sahf4d2fdd45", LAST_INSERT_ID())
WHERE id = LAST_INSERT_ID();
COMMIT;
benutze "mysql_insert_id ()". mysql_insert_id () wirkt auf die zuletzt ausgeführte Abfrage. Rufen Sie mysql_insert_id () unmittelbar nach der Abfrage auf, die den Wert generiert.
Nachfolgend finden Sie ein Anwendungsbeispiel:
<?php
$link = mysql_connect('localhost', 'username', 'password');
if (!$link) {
die('Could not connect: ' . mysql_error());
}
mysql_select_db('mydb');
mysql_query("INSERT INTO mytable VALUES('','value')");
printf("Last inserted record has id %d\n", mysql_insert_id());
?>
Ich hoffe, dass das obige Beispiel nützlich ist.
mysql_insert_id();
Das ist es :)
SELECT id FROM `table` ORDER BY id DESC LIMIT 1
Ich bezweifle zwar an seiner Produktivität, aber es ist 100% zuverlässig
mit der Antwort von ravi404:
CREATE FUNCTION `getAutoincrementalNextVal`(`TableName` VARCHAR(50))
RETURNS BIGINT
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
DECLARE Value BIGINT;
SELECT
AUTO_INCREMENT INTO Value
FROM
information_schema.tables
WHERE
table_name = TableName AND
table_schema = DATABASE();
RETURN Value;
END
Verwenden Sie in Ihrer Einfügeabfrage, um einen SHA1-Hash zu erstellen. Ex.:
INSERT INTO
document (Code, Title, Body)
VALUES (
sha1( getAutoincrementalNextval ('document') ),
'Title',
'Body'
);
Verbesserung von @ ravi404, falls Ihr Autoincrement-Offset NICHT 1 ist:
SELECT (`auto_increment`-1) + IFNULL(@@auto_increment_offset,1)
FROM INFORMATION_SCHEMA.TABLES
WHERE table_name = your_table_name
AND table_schema = DATABASE( );
( auto_increment
-1): Die DB-Engine scheint immer einen Offset von 1 zu berücksichtigen. Sie müssen diese Annahme also verwerfen und dann den optionalen Wert von @@ auto_increment_offset oder standardmäßig 1: IFNULL (@@ auto_increment_offset, 1) hinzufügen.
Bei mir funktioniert es und sieht einfach aus:
$auto_inc_db = mysql_query("SELECT * FROM my_table_name ORDER BY id ASC ");
while($auto_inc_result = mysql_fetch_array($auto_inc_db))
{
$last_id = $auto_inc_result['id'];
}
$next_id = ($last_id+1);
echo $next_id;//this is the new id, if auto increment is on
$last_id
wiederholt zuzuweisen, wenn Sie nur können DESC
. Ihr while
Block hat eine Menge nutzloser Arbeit geleistet.
auto_increment
Säule