it-swarm.com.de

So erhalten Sie die nächste Auto-Inkrement-ID in mysql

Wie bekomme ich 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))
94
faressoft

Verwenden Sie LAST_INSERT_ID() aus Ihrer SQL-Abfrage.

Oder

Sie können auch mysql_insert_id() verwenden, um PHP zu verwenden.

12
Sarfraz

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'
232
ravi404

Sie können den Autoinkrementierungswert next folgendermaßen erhalten:

SHOW TABLE STATUS FROM tablename LIKE Auto_increment
/*or*/
SELECT `auto_increment` FROM INFORMATION_SCHEMA.TABLES
WHERE table_name = 'tablename'

Beachten Sie, dass Sie not verwenden sollten, um die Tabelle zu ändern. Verwenden Sie dazu automatisch eine auto_increment-Spalte.
Das Problem ist, dass last_insert_id() rückblickend ist und somit innerhalb der aktuellen Verbindung garantiert werden kann.
Dieses Baby ist prospektiv und daher für jede Verbindung nicht eindeutig und nicht verlässlich.
Es würde nur in einer einzigen Verbindungsdatenbank funktionieren, aber einzelne Verbindungsdatenbanken haben heute die Gewohnheit, morgen mehrere Verbindungsdatenbanken zu werden.

Siehe: SHOW TABLE STATUS

40
Johan

Die oberste Antwort verwendet PHP MySQL_ für eine Lösung. Ich denke, ich würde eine aktualisierte PHP MySQLi_ -Lösung dafür freigeben. 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'];

Das nächste Auto-Inkrement wird in einer Tabelle angezeigt.

10
Hexchaimen

In PHP können Sie Folgendes versuchen:

$query = mysql_query("SELECT MAX(id) FROM `your_table_name`");
$results = mysql_fetch_array($query);
$cur_auto_id = $results['MAX(id)'] + 1;

OR

$result = mysql_query("SHOW TABLE STATUS WHERE `Name` = 'your_table_name'");
$data = mysql_fetch_assoc($result);
$next_increment = $data['Auto_increment'];
9
Naresh Jain

Dies gibt einen Auto-Inkrement-Wert für die MySQL-Datenbank zurück, und ich habe keine Überprüfung mit anderen Datenbanken durchgeführt. Bitte beachten Sie, dass die Abfragesyntax bei Verwendung einer anderen Datenbank unterschiedlich sein kann.

SELECT AUTO_INCREMENT 
FROM information_schema.tables
WHERE table_name = 'your_table_name'
     and table_schema = database();
8

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

6
Angel

Eine einfache Abfrage würde SHOW TABLE STATUS LIKE 'table_name'

4
Raa
4
Nick Pavluk

Sie können die ID beim Einfügen nicht verwenden, und Sie benötigen sie auch nicht. MySQL kennt die ID nicht einmal, wenn Sie diesen Datensatz einfügen. Sie könnten einfach "sahf4d2fdd45" in der payment_code-Tabelle speichern und später id und payment_code verwenden.

Wenn Sie wirklich benötigen, dass Ihr Zahlungscode die ID enthält, aktualisieren Sie die Zeile nach der Einfügung, um die ID hinzuzufügen.

3
Jacob

Ich schlage vor zu überdenken, was Sie tun. Ich habe nie einen einzigen Anwendungsfall erlebt, bei dem dieses spezielle Wissen erforderlich ist. Die nächste ID ist ein sehr spezielles Implementierungsdetail und ich würde nicht darauf zählen, dass es ACID-sicher ist.

Machen Sie eine einfache Transaktion, die Ihre eingefügte Zeile mit der letzten ID aktualisiert:

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;
3
Markus Malkusch

Wofür benötigen Sie die nächste inkrementelle ID? 

MySQL erlaubt nur ein Auto-Increment-Feld pro Tabelle und es muss auch der Primärschlüssel sein, um die Eindeutigkeit zu gewährleisten. 

Wenn Sie die nächste Einfügungs-ID erhalten, ist sie möglicherweise nicht verfügbar, wenn Sie sie verwenden, da der Wert, den Sie haben, nur im Bereich dieser Transaktion liegt. Abhängig von der Auslastung Ihrer Datenbank kann dieser Wert daher bereits verwendet werden, wenn die nächste Anforderung eingeht.

Ich würde vorschlagen, dass Sie Ihr Design überprüfen, um sicherzustellen, dass Sie nicht wissen müssen, welchen Auto-Increment-Wert Sie als Nächstes zuweisen möchten 

verwenden Sie "mysql_insert_id ()". mysql_insert_id () wirkt auf die letzte ausgeführte Abfrage. Rufen Sie mysql_insert_id () sofort nach der Abfrage auf, die den Wert generiert.

Unten sehen 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 das obige Beispiel ist nützlich.

2
sagarchavda

Sie müssen zuerst eine Verbindung zu MySQL herstellen und eine Datenbank auswählen 

$table_name = "myTable"; 
$query = mysql_query("SHOW TABLE STATUS WHERE name='$table_name'"); 
$row = mysql_fetch_array($query); 
$next_inc_value = $row["AUTO_INCREMENT"];  
2
jondinham

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'
);
1
Paulo A. Costa
mysql_insert_id();

Das ist es :)

1
user3814281
SELECT id FROM `table` ORDER BY id DESC LIMIT 1

Ich bezweifle zwar an seiner Produktivität, ist aber zu 100% zuverlässig

1
Tebe

Für mich 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
0
Toncsiking

Verbesserung von @ ravi404 für den Fall, dass Ihr Autoinkrement-Offset IS 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 Versatz von 1 zu berücksichtigen. Daher müssen Sie diese Annahme aufheben und dann den optionalen Wert @@ auto_increment_offset oder den Standardwert 1 angeben: IFNULL (@@ auto_increment_offset, 1). 

0
Olivier