2014-01-30 5 views
5

Wir haben ein Problem mit dem Löschen von Datensätzen gefunden, die auf bestimmte Versionen von MySQL zu sein scheint. Ich kann jedoch keine Erwähnung dieses Problems finden, um zu wissen, wann es behoben wurde.MySQL löschen Problem mit Null

In einem Code wurde versucht, einen Löschvorgang auszuführen, bei dem der Primärschlüssel NULL ist (was nie vorkommen sollte), wobei Code aus einem Framework generiert wird. MySQL löschte eine zuvor eingefügte Zeile mit einem gültigen Nicht-Null-Primärschlüssel.

Kann das Problem hier demonstrieren.

Prüftabelle -

CREATE TABLE IF NOT EXISTS `fred_delete` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `test` varchar(25) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

dann die folgende SQL ausführen: -

INSERT INTO fred_delete 
(id, test) 
VALUES 
(NULL, 'a'), 
(NULL, 'b'), 
(NULL, 'c'), 
(NULL, 'd'), 
(NULL, 'e'), 
(NULL, 'f'), 
(NULL, 'g'); 

DELETE FROM fred_delete WHERE id IS NULL; 

SELECT * FROM fred_delete; 

auf 5.1.58-log mysql installieren dies fügt 7 Zeilen löscht dann die erste Zeile eingefügt. Bei 5.6.12-log install fügt dies 7 Zeilen ein und löscht keine.

Weiß jemand, welche Versionen von MySQL diesem Verhalten unterliegen? Oder ist das ein Problem mit der Konfiguration?

+1

Ich bin nicht mit dem Fehler vertraut. Hat die 'id' hier in der Fehlersituation einen 'NULL' Wert, oder ist es die 'WHERE ID ID NULL ', die fehlerhaft ist? Das hilft bei der Suche in der Fehlerdatenbank;) – Wrikken

+1

Was passiert mit einem 'SELECT * FROM fred_delete WHERE id IS NULL' auf dem Buggy-System? –

+0

@Wrikken Die ID ist ein Autoinkrement-Primärschlüssel und kann nicht gültig auf NULL gesetzt werden. Ich habe versucht, die Bugsite zu googeln, aber nichts gefunden. – Kickstart

Antwort

8

Aha, es ist kein Fehler, es ist eine Funktion.

sql_auto_is_null:

Wenn dieser Variable auf 1 (Standardeinstellung) gesetzt ist, dann nach einer Anweisung, die erfolgreich einen automatisch generierte AUTO_INCREMENT Wert 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

Die default has been changed from 1 to 0 in >= 5.5.3

It is mentioned in MySQL's bug database, aber th Es war jemand, der sich über dieses Feature genauso wenig bewusst war wie wir.

+0

+1: Ausgezeichnete Arbeit. :) –

+0

Ausgezeichnet. Vielen Dank. – Kickstart

+1

(Ich schlage vor, in dieser Antwort auf Bug 44694 zu verweisen: obwohl dies kein Bug ist, ist das der Post in der Bug-DB, der dieser Frage auf SO entspricht, was meiner Meinung nach einen gewissen Wert haben könnte.) –