2013-08-12 25 views
8

Sto usando MySQL. Voglio recuperare il valore successivo che la colonna AUTO_INCREMENT prenderà senza inserire un nuovo record.Trova il prossimo valore della colonna AUTO_INCREMENT in MySQL

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

in Oracle avrei usato sequencename.nextval(); Ma quello che uso per in MySQL?

Ecco perché l'ho fatto non uso

select max(id) from ABC; 

Supponiamo che io ho una voce con id = 2. Ora ID colonna assumerà il valore successivo come 3. Prima di creare un record con id = 3, Se elimino il record con id = 2. La risposta per la query che ho menzionato sarà 2. Ma voglio il valore attuale 3, che la colonna auto_increment prenderà comunque.

+0

nessuno dei due. Voglio ricevere un valore. Ma queste risposte stampano una descrizione. Non un valore recuperabile –

+0

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

+0

UTILIZZO QUESTO CODICE: 'SELEZIONA (IFNULL (max (id), 0) + 1) come id dalla tabella'. IFNULL sarà utile se non ci sono record nella tabella –

risposta

8

stato tabella query come questa:

SHOW TABLE STATUS WHERE `Name` = 'table_name' 

Ora nel risultato che si otterrà una colonna chiamata Auto_increment. Questo è il valore che stavi chiedendo.

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

completa esempio qui: http://www.avajava.com/tutorials/lessons/how-do-i-use-jdbc-to-query-a-mysql-database.html

+0

Sì, sta dando un'uscita. Come posso recuperare quel valore dallo stato visualizzato? selezionare auto_increment da (MOSTRA TABLE STATUS WHERE 'Name' = 'table_name') non funziona –

+0

Ma in che lingua? –

+0

java che utilizza JDBC. Desidero ricevere solo il valore come risultato in un ResultSet. –

0

Non v'è alcun modo per garantire che valore che si sta per ottenere prima di inserire la riga. Questo è principalmente dovuto al fatto che dovrete bloccare l'intera tabella per garantire che nessun altro thread faccia un inserto con il "vostro" valore successivo.

È possibile riservare un valore avviando una transazione, inserendo una riga, ottenendo il valore e quindi eseguendo un rollback. Quindi puoi tranquillamente usare quel valore.

Sarà molto più semplice inserire la riga, quindi forse non sto capendo lo scopo di ciò che stai facendo.

+0

Voglio eseguire la query di inserimento in un'altra tabella, controllare se è valida e solo quindi inserirla in questa tabella. –

+0

Il modo migliore per farlo sarebbe una transazione.Se stai usando MyISAM il meglio che posso pensare è inserire la riga, ottenere il valore di autoincremento, , se fallisce cancella la riga. – Vatev

1

Se ho capito bene, è possibile utilizzare il numero di righe come indicatore:

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