2015-09-04 31 views
7

Ogni volta che eseguo una dichiarazione SELECT con WHERE id is NULL direttamente dopo un INSERT, ottengo l'ultima riga inserita.MySQL restituisce l'ultimo inserito durante l'interrogazione IS NULL

Sto usando MySQL 5.1.73.

Si verifica direttamente nella shell MySQL; ecco la mia console:

mysql> CREATE TABLE testing (
    ->  id int(11) NOT NULL AUTO_INCREMENT, 
    ->  name VARCHAR(200), 
    ->  PRIMARY KEY (id) 
    ->) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
Query OK, 0 rows affected (0.03 sec) 

mysql> INSERT INTO testing (name) VALUES ('test'); 
Query OK, 1 row affected (0.01 sec) 

mysql> SELECT * FROM testing WHERE id IS NULL; 
+----+------+ 
| id | name | 
+----+------+ 
| 1 | test | 
+----+------+ 
1 row in set (0.01 sec) 

Qualcuno può dirmi cosa sta succedendo qui? È un bug o è un'ambientazione che mi manca?

+0

Ad una ipotesi, forse lo fa perché è così che viene implementata la funzione "ultimo ID inserito"? – Hammerite

+0

Penso che il problema sia con '$ query-> closeCursor();' – Saty

+0

@Saty Rimuovendo closeCursor si ottiene comunque lo stesso risultato. – swordbeta

risposta

3

Ho trovato la risposta da solo. La mia versione di MySQL (5.1.73, l'ultima disponibile su CentOS 6) ha l'impostazione di default su sql_auto_is_null, mentre le versioni più recenti non lo fanno:

 
╔═════════════════════════════╦══════════════════╦══════════════════╗ 
║ System Variable (<= 5.5.2)Namesql_auto_is_null ║ 
║        ║ Variable Scope ║ Session   ║ 
║        ║ Dynamic Variable ║ Yes    ║ 
╠═════════════════════════════╬══════════════════╬══════════════════╣ 
║ System Variable (>= 5.5.3)Namesql_auto_is_null ║ 
║        ║ Variable Scope ║ Global, Session ║ 
║        ║ Dynamic Variable ║ Yes    ║ 
╠═════════════════════════════╬══════════════════╬══════════════════╣ 
║ Permitted Values (<= 5.5.2) ║ Type    ║ boolean   ║ 
║        ║ Default   ║ 1    ║ 
╠═════════════════════════════╬══════════════════╬══════════════════╣ 
║ Permitted Values (>= 5.5.3) ║ Type    ║ boolean   ║ 
║        ║ Default   ║ 0    ║ 
╚═════════════════════════════╩══════════════════╩══════════════════╝ 

Se questa variabile è impostata su 1 (impostazione predefinita), poi, dopo una dichiarazione che inserisce con successo un AUTO_INCREMENT valore generato automaticamente, è possibile trovare tale valore mediante l'emissione di una dichiarazione della forma seguente:

SELECT * FROM tbl_name WHERE auto_col IS NULL

Se l'istruzione restituisce una riga, il valore di r eturned è lo stesso come se si invocasse la funzione LAST_INSERT_ID(). Per i dettagli, compreso il valore di ritorno dopo un inserimento di più righe, vedere Section 12.14, “Information Functions”. Se il valore AUTO_INCREMENT non è stato inserito correttamente, l'istruzione SELECT non restituisce alcuna riga.

Il comportamento di recupero di un valore AUTO_INCREMENT utilizzando un confronto IS NULL viene utilizzato da alcuni programmi ODBC, ad esempio Accesso. Vedi Obtaining Auto-Increment Values. Questo comportamento può essere disabilitato impostando sql_auto_is_null su 0.

Il valore predefinito di sql_auto_is_null è 0 a partire da MySQL 5.5.3 e 1 per le versioni precedenti.