2013-08-12 8 views
8

Używam MySQL. Chcę pobrać następną wartość, którą zajmie kolumna AUTO_INCREMENT bez wprowadzania nowego rekordu.Znajdź następną wartość kolumny AUTO_INCREMENT w MySQL

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

w Oracle użyłbym sequencename.nextval(); Ale co używam w MySQL?

Oto dlaczego zrobiłem nie użycie

select max(id) from ABC; 

Załóżmy, że mam wpis id = 2. Teraz id kolumny przyjmie następną wartość jako 3. Zanim utworzę rekord o id = 3, Jeśli usunę rekord z id = 2. Odpowiedź na pytanie, o którym wspomniałem, będzie 2. Ale chcę mieć rzeczywistą wartość 3, która i tak zajmie kolumna auto_increment.

+0

ani. Chcę otrzymać wartość. Ale te odpowiedzi wypisują opis. Wartość nie do odzyskania –

+0

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

+0

UŻYJ TEGO KODU: 'SELECT (IFNULL (max (id), 0) + 1) jako id z tabeli ". IFNULL będzie pomocny, jeśli nie ma rekordu w tabeli –

Odpowiedz

8

stan tabeli Query tak:

SHOW TABLE STATUS WHERE `Name` = 'table_name' 

Teraz w wyniku dostaniesz kolumnę o nazwie Auto_increment. To jest wartość, o którą prosiłeś.

w Javie:

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"); 

Pełny przykład tutaj: http://www.avajava.com/tutorials/lessons/how-do-i-use-jdbc-to-query-a-mysql-database.html

+0

Tak, daje wynik. Jak pobrać tę wartość z wyświetlonego stanu? wybierz auto_increment z (SHOW TABLE STATUS WHERE "Nazwa" = "table_name") nie działa –

+0

Ale w jakim języku? –

+0

java przy użyciu JDBC. Chcę otrzymać tylko wartość jako wynik w ResultSet. –

0

Nie ma sposobu, aby zagwarantować, jaką wartość masz zamiar dostać przed włożeniem wiersz. Dzieje się tak głównie dlatego, że będziesz musiał zablokować całą tabelę, aby zagwarantować, że żaden inny wątek nie zrobi wstawki z "twoją" następną wartością.

Możesz zarezerwować wartość, rozpoczynając transakcję, wstawiając wiersz, pobierając wartość, a następnie wykonując wycofanie. Wtedy możesz bezpiecznie użyć tej wartości.

Łatwiej będzie wstawić wiersz, więc może nie rozumiem celu tego, co robisz.

+0

Chcę wykonać kwerendę wstawiania do innej tabeli, sprawdź, czy jest ona ważna, a dopiero potem wstaw do tej tabela. –

+0

Najlepszym sposobem na zrobienie tego byłaby transakcja.Jeśli korzystasz z MyISAM, najlepiej mogę wstawić wiersz, uzyskać wartość autoinkrementacji, , jeśli nie uda się usunąć wiersz. – Vatev

1

Jeśli dobrze rozumiem, można użyć liczby wierszy jako wskaźnika:

SELECT TABLE_ROWS+1 
FROM information_schema.tables 
WHERE table_name='tableName' 
AND table_schema = DATABASE(); 
Powiązane problemy