2008-11-19 12 views
6

Ich habe die folgende Tabelle in MySQL (Version 5):MySQL: Hinzufügen laufenden Jahr als Standardwert für ein Feld ‚Jahr‘

id int(10)  UNSIGNED    No auto_increment     
year varchar(4) latin1_swedish_ci No    
title varchar(250) latin1_swedish_ci Yes NULL   
body text   latin1_swedish_ci Yes NULL 

Und ich möchte, dass die db Auto das aktuelle Jahr auf Insert hinzufügen , ich habe die folgende SQL-Anweisung versucht:

ALTER TABLE `tips` CHANGE `year` `year` VARCHAR(4) NOT NULL DEFAULT year(now()) 

Aber es gibt die folgenden Fehler:

1067 - Invalid default value for 'year' 

Was kann ich diesen Spaß zu erhalten tun Möglichkeit? Danke im Voraus!

@ gabriel1863: Danke für die Antwort, aber ich bekomme immer noch den gleichen Fehler. Auch wenn ich Backticks im Jahresfeld verwende.

Vielen Dank für die Hilfe!

+0

mit Spalten mit dem gleichen Namen wie ein Datentyp in der Regel eine wirklich schlechte Idee – warren

Antwort

14

The DEFAULT value clause in a data type specification indicates a default value for a column. With one exception, the default value must be a constant; it cannot be a function or an expression. This means, for example, that you cannot set the default for a date column to be the value of a function such as NOW() or CURRENT_DATE. The exception is that you can specify CURRENT_TIMESTAMP as the default for a TIMESTAMP column.

-- MySQL Manual

können Sie jedoch einen trigger schreiben, die den Wert festlegt. Ich wünschte, ich könnte helfen, aber ich bin nicht wirklich mit dem Schreiben gespeicherter Prozeduren in MySQL vertraut.

ich denke, das würde funktionieren:

CREATE TRIGGER ins_year 
BEFORE INSERT ON tips 
    FOR EACH ROW SET NEW.year = YEAR(NOW()); 
7

sollten folgende Arbeiten:

ALTER TABLE tips MODIFY COLUMN year YEAR(4) NOT NULL DEFAULT CURRENT_TIMESTAMP 

Year Data Type Weitere Informationen finden Sie auf.

Also habe ich getestet, sobald ich Zugang habe und es nicht funktioniert. Wie ein anderes Poster hervorhob, arbeitet CURRENT_TIMESTAMP nur am TIMESTAMP Datentyp.

Gibt es ein spezifisches Problem mit dem Speichern eines vollständigen Zeitstempels und dann nur mit dem Jahr in Ihrem Code? Wenn nicht, würde ich empfehlen, diesen Wert als Zeitstempel zu speichern.

Die andere Option wäre, eine trigger zu erstellen:

CREATE TRIGGER example_trigger AFTER INSERT ON tips 
FOR EACH ROW BEGIN 
UPDATE tips SET year = YEAR(NOW()) WHERE tip_id = NEW.tip_id 
END; 

Andernfalls ordnen Sie diesen Wert auf die INSERT-Anweisung aus dem Code.

Die beste Lösung in Ihrem Fall hängt vollständig von den Umständen Ihrer speziellen Anwendung ab.

+0

Schöne ist, ich war für genau die gleiche Sache heute suchen! – Tom