2015-09-04 5 views
7

Immer wenn ich eine SELECT Anweisung mit WHERE id is NULL direkt nach einer INSERT mache, bekomme ich die letzte Zeile eingefügt.MySQL gibt zuletzt eingefügt, wenn Abfrage IS NULL

Ich benutze MySQL 5.1.73.

Es passiert direkt in der MySQL-Shell; Hier ist meine Konsole:

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) 

Kann mir jemand sagen, was hier vor sich geht? Ist das ein Fehler oder fehlt eine Einstellung?

+0

Bei einer Vermutung, vielleicht ist es das, weil so die "letzte eingefügte ID" -Funktion implementiert ist? – Hammerite

+0

Ich denke, das Problem ist mit '$ query-> closeCursor();' – Saty

+0

@Saty Entfernen der closeCursor führt immer noch zum gleichen Ergebnis. – swordbeta

Antwort

3

Ich habe die Antwort selbst gefunden. Meine MySQL-Version (5.1.73, der letzte auf CentOS 6) hat die sql_auto_is_null durch Voreinstellung auf, während neuere Versionen nicht:

 
╔═════════════════════════════╦══════════════════╦══════════════════╗ 
║ 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    ║ 
╚═════════════════════════════╩══════════════════╩══════════════════╝ 

Wenn diese Variable auf 1 gesetzt ist (Standardeinstellung), dann nach einer Anweisung, die einen automatisch generierte AUTO_INCREMENT Wert erfolgreich einfügt, können Sie diesen Wert finden, indem Sie eine Erklärung über das folgende Formular Ausgabe:

SELECT * FROM tbl_name WHERE auto_col IS NULL

Wenn die Anweisung eine Zeile zurückgibt, wird der Wert r Umgestellt ist das gleiche wie wenn Sie die LAST_INSERT_ID() Funktion aufgerufen haben. Einzelheiten, einschließlich des Rückgabewerts nach einer mehrzeiligen Einfügung, finden Sie unter Section 12.14, “Information Functions”. Wenn kein AUTO_INCREMENT Wert erfolgreich eingefügt wurde, gibt die SELECT Anweisung keine Zeile zurück.

Das Verhalten beim Abrufen eines AUTO_INCREMENT-Werts mit einem IS NULL-Vergleich wird von einigen ODBC-Programmen wie Access verwendet. Siehe Obtaining Auto-Increment Values. Dieses Verhalten kann deaktiviert werden, indem sql_auto_is_null auf 0 gesetzt wird.

Der Standardwert sql_auto_is_null ist 0 von MySQL 5.5.3 und 1 für frühere Versionen.