2014-02-20 17 views
14

Ich möchte einige Erläuterungen zum Verhalten von Standardwerten in MySQL 5.5 & 5.6. Lassen Sie uns sagen wir die folgende Tabelle auf einem MySQL 5.5-Server haben:MySQL 5.5 & 5.6 Standardwerte

CREATE TABLE `test` (
`TestColumn` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP 
) ENGINE=INNODB DEFAULT CHARSET=utf8; 

Ich bin in der Lage führen Sie die folgende Abfrage, ohne Frage:

INSERT INTO `test` VALUES (NULL); 

, welche die folgende Zeile erstellt:

TestColumn 
2014-02-20 14:55:05 

Jetzt, wenn ich den gleichen Test auf einem MySQL 5.6 Server wiederhole, schlägt die Einfügung fehl:

Error Code: 1048 
Column 'TestColumn' cannot be null 

Ich verstehe, dass Timestamp automatische Initialisierung in 5.6 (http://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html) geändert hat, aber was ich nicht herausfinden kann, ist, wie das Verhalten in 5.5 in 5.5 zu replizieren.

Nicht sicher, ob es wichtig ist, aber unser 5.6 Server hat explicit_defaults_for_timestamp auf ON gesetzt.

Idealerweise ist eine Lösung dafür, aber wenn jemand ein besseres Verständnis hat und es erklären kann, wäre das auch nützlich.

Danke.

EDIT: Wir verwenden MySQL 5.6.13

+1

der erste Einsatz sollte in erster Linie nicht funktioniert haben. Sie haben * gebeten *, dass die Datenbank einen NULL-Wert in die Nicht-Null-Spalte schreibt, also lehnt 5.6 das ab. –

+0

Dies funktioniert am 5.6 – bear

+0

@a_horse_with_no_name die Definition ist, dass die Spalte nicht null sein kann - wenn jedoch ein Standard angegeben ist, wird es den Standard verwenden. Bearbeiten, scratchen, dass – bear

Antwort

12

Das Verhalten, das Sie oben in 5.5 zeigte, war tatsächlich ein Fehler. Dies wurde in 5.6.11 behoben. Schauen Sie sich die release notes for 5.6.11 ganz unten an. Es war Teil der Bugs 68472 und 16394472 (auf die ich eigentlich keinen Link finde).

Wenn Sie die explicit_defaults_for_timestamp Flagge ausschalten, sollte es funktionieren, wie es in 5,5 tat

Das war genau die gleiche Problem, das ich mit unserer DB hatte, als wir 5,5-5,6 aktualisiert.

+0

Der Grund dafür ist ein wenig kompliziert. Ihre Abfrage funktionierte in 5.5 aufgrund eines Fehlers, der es Ihnen erlaubte, eine Spalte auf NULL zu setzen, wenn es Ihnen eigentlich nicht möglich gewesen wäre. Als 5.6 ausgerollt wurde, haben sie das Flag "explicit_defaults_for_timestamp" gesetzt, um zu ermöglichen, dass veraltete Funktionen in der Zwischenzeit funktionieren. In 5.6.11 haben sie jedoch den Fehler behoben, auf den sich Ihre (und meine) Anfrage verlassen hat. Zum Glück für Sie und ich ist das neue Standardverhalten mit diesem Flag genau das Verhalten, das wir wollten. – Boerema

+0

+1 Nur einen Blocker für uns repariert. Vielen Dank! – Gray

0

Haben Sie versucht, die Spalte weggelassen?

INSERT INTO `test`() VALUES(); 
+0

Hi Rob, das würde für meine funktionieren Beispiel, aber in der Produktion verwenden wir Hibernate als unser ORM, so dass wir in vielen Fällen NULL gegen eine Spalte setzen können, danke trotzdem. – BombTodley

+0

und führt es zu einem dynamischen Zeitstempel Standard anstelle einer tatsächlichen Null? Hm. nicht sicher, ob das möglich ist. Haben Sie "explicit_defaults_for_timestamp auf OFF gesetzt"? –

+0

Es ist ja - wie ich in meinem Kommentar oben gesagt habe macht es immer noch keinen Sinn für mich, aber es funktioniert! – BombTodley

Verwandte Themen