2013-08-12 11 views
8

Ich benutze MySQL. Ich möchte den nächsten Wert abrufen, den die AUTO_INCREMENT-Spalte ohne Eingabe eines neuen Datensatzes annehmen wird.Finde den nächsten Wert der AUTO_INCREMENT Spalte in MySQL

create table ABC(id int(10) NOT NULL AUTO_INCREMENT,name char(10)); 

In Orakel würde ich sequencename.nextval(); verwendet haben, aber was ich in MySQL verwenden?

Hier ist, warum ich habe nicht Verwendung

select max(id) from ABC; 

Angenommen, ich habe einen Eintrag mit id = 2. Jetzt wird Spalte ID den nächsten Wert als 3 annehmen. Bevor ich einen Datensatz mit ID = 3 erstellen, Wenn ich den Datensatz mit ID = 2 löschen. Die Antwort auf die Frage, die ich erwähnt habe, ist 2. Aber ich möchte den tatsächlichen Wert 3, den die Spalte auto_increment sowieso nehmen wird.

+0

keines von beiden. Ich möchte einen Wert erhalten. Aber diese Antworten drucken eine Beschreibung. Kein abrufbarer Wert –

+0

http://www.microshell.com/database/mysql/ emulating-nextval-function-to-get-sequence-in-mysql/ – Mihai

+0

VERWENDEN SIE DIESEN CODE: 'SELECT (IFNULL (max (id), 0) + 1) als ID aus Tabelle ". IFNULL wird hilfreich sein, wenn in der Tabelle kein Datensatz vorhanden ist –

Antwort

8

Abfrage Tabellenstatus wie folgt aus:

SHOW TABLE STATUS WHERE `Name` = 'table_name' 

Jetzt in Folge erhalten Sie eine Spalte erhalten namens Auto_increment. Dies ist der Wert, nach dem Sie gefragt haben.

In JAVA:

conn = DriverManager.getConnection(connectionUrl, connectionUser, connectionPassword); 
stmt = conn.createStatement(); 
rs = stmt.executeQuery("SHOW TABLE STATUS WHERE `Name` = 'table_name'"); 
rs.next(); 
String nextid = rs.getString("Auto_increment"); 

Voll Beispiel hier: http://www.avajava.com/tutorials/lessons/how-do-i-use-jdbc-to-query-a-mysql-database.html

+0

Ja, es gibt einen Ausgang. Wie kann ich diesen Wert aus dem angezeigten Status abrufen? select auto_increment aus (SHOW TABLE STATUS WHERE 'Name' = 'table_name') funktioniert nicht –

+0

Aber in welcher Sprache? –

+0

Java mit JDBC. Ich möchte nur den Wert als Ergebnis in einem ResultSet erhalten. –

0

Es gibt keine Möglichkeit zu garantieren, welchen Wert Sie vor dem Einsetzen der Reihe bekommen gehen. Dies liegt vor allem daran, dass Sie die gesamte Tabelle sperren müssen, um sicherzustellen, dass kein anderer Thread eine Einfügung mit "Ihrem" nächsten Wert vornimmt.

Sie können einen Wert reservieren, indem Sie eine Transaktion starten, eine Zeile einfügen, den Wert abrufen und dann einen Rollback durchführen. Dann können Sie diesen Wert sicher verwenden.

Es wird viel einfacher sein, nur die Zeile einzufügen, also verstehe ich vielleicht nicht den Zweck dessen, was Sie tun.

+0

Ich möchte einfügen Abfrage in eine andere Tabelle, überprüfen Sie, ob es gültig ist, und nur dann in diese Tabelle einfügen. –

+0

Der beste Weg, dies zu tun wäre eine Transaktion.Wenn Sie MyISAM verwenden, ist das Beste, was ich mir vorstellen kann, die Zeile einzufügen, den Autoinkrement-Wert zu erhalten, , falls es fehlschlägt, die Zeile zu löschen. – Vatev

1

Wenn ich richtig verstehe, können Sie die Anzahl der Zeilen als Indikator verwenden:

SELECT TABLE_ROWS+1 
FROM information_schema.tables 
WHERE table_name='tableName' 
AND table_schema = DATABASE(); 
Verwandte Themen