2009-09-22 8 views
6

Ich habe Tabelle wie unten gezeigt. Um eine Standard jetzt Spalte Einschränkung von MySQL zu umgehen habe ich die Spitze als here gezeigtMySQL zwei Spalte Timestamp Standard JETZT Wert ERROR 1067

CREATE TABLE IF NOT EXISTS mytable (
    id INT NOT NULL AUTO_INCREMENT , 
    create_date TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00' , 
    update_date TIMESTAMP NULL DEFAULT NOW() ON UPDATE NOW() , 
    PRIMARY KEY (`parti_id`)) 
ENGINE = InnoDB; 

Mein sql_mode nicht NO_ZERO_DATE enthält als here meine Ausgabe zeigte:

mysql> SELECT @@sql_mode; 
+------------+ 
| @@sql_mode | 
+------------+ 
|   | 
+------------+ 
1 row in set (0.00 sec) 

noch Es gibt der Fehler wie folgt:

ERROR 1067 (42000) at line xx in file: '/myschema.sql': Invalid default value for 'create_date' 

Ich benutze MySQL 5.1.37 auf Ubuntu

Wie kann ich es beheben? Vielen Dank.

Antwort

12

Sie können nur eine Timestamp-Spalte haben, die standardmäßig auf CURRENT_TIMESTAMP oder NOW() pro Tisch. Dies ist ein bekannter Fehler in MySQL.

Um dies zu umgehen, geben Sie als Standard für die erstellte Spalte einen gültigen Zeitstempelwert an und fügen Sie dann den Zeitstempel in Ihren CRUD-Anwendungscode ein. Verwenden Sie NOW() oder CURRENT_TIMESTAMP für Ihre aktualisierte Spalte Standard.

Referenzmaterial: http://dev.mysql.com/doc/refman/5.1/en/timestamp.html

weiter zu MySQL Manko in diesem Bereich veranschaulichen, betrachten Sie den folgenden Code:

CREATE TABLE testing_timestamps (
    id INT NOT NULL AUTO_INCREMENT, 
    pk_id INT NOT NULL, 
    col1 TIMESTAMP DEFAULT 0, 
    col2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY(id) 
); 

delimiter $$ 
CREATE TRIGGER testing_timestamps_trigger 
    AFTER INSERT ON testing_timestamps 
    FOR EACH ROW 
    BEGIN 
    UPDATE testing_timestamps SET col1 = NOW() WHERE id = MAX(id); 
    END; 
$$ 
delimiter ; 

INSERT INTO testing_timestamps (id) VALUES (0); 

Die Ausgabe von diesem anzeigt:

mysql> INSERT INTO testing_timestamps (id) VALUES (0); 
ERROR 1442 (HY000): Can't update table 'testing_timestamps' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 

Dies ist ein Mist, weil ein Trigger in diesem Fall eine gute Arbeit wäre.

+0

Dies ist kein Fehler, es ist ein Feature: „Für eine TIMESTAMP-Spalte in einer Tabelle, können Sie den aktuellen Zeitstempel als Standardwert zuweisen können und die Auto-Update-Wert Es ist möglich, dass der aktuelle Zeitstempel der Standardwert für die Initialisierung der Spalte, der Wert für die automatische Aktualisierung oder beides ist.Der aktuelle Zeitstempel kann nicht der Standardwert für eine Spalte und der Wert für die automatische Aktualisierung sein für eine andere Spalte. " –

+0

Die Debatte darüber, ob das ein" Bug "ist oder nicht, bleibt bestehen, da dies ernsthaft nervt. Warum kann ich nicht zwei Zeitstempelspalten mit einem Standardwert von jetzt() mit der zweiten Spalte Auto-Update haben? Die Antwort ist, dass MySQL das nicht tut. Ich nenne das nicht wirklich ein Feature. –

+0

Randy danke für deine Antwort. Ich kenne den von Ihnen angegebenen Link. Ich suche nur nach einem Workaround. Es scheint jedoch, dass alle im Internet gezeigten Tricks einfach nicht funktionieren. –

7

Eigentlich ist Randys Code kaputt. Es wird nicht funktionieren, da es sich um einen mutierenden Trigger handelt. Sie können die Tabelle, die die Aktualisierung initiiert hat, nicht aktualisieren. Wenn Sie beispielsweise die Tabelle SESSIONS aktualisieren, können Sie die Tabelle in Ihrem Trigger nicht mit einer UPDATE-, INSERT- oder DELETE-Anweisung ändern. Die einzige Möglichkeit, die Tabelle zu ändern, an die der Trigger angehängt ist, ist die Verwendung der Präfixe "NEW" oder "OLD", wie unten gezeigt. (Natürlich ist es erlaubt, andere Tabellen nach Belieben zu aktualisieren.) Hier ist ein Beispiel, wie man das von der Op.

create table sessions (
    id integer not null, 
    created timestamp not null default 0, 
    updated timestamp not null default 0 
); 

delimiter // 
create trigger bifer_sessions_ts before insert on sessions for each row 
begin 
    set new.created = now(); 
    set new.updated = now(); 
end; 
// 
create trigger bufer_sessions_ts before update on sessions for each row 
begin 
    set new.updated = now(); 
end; 
// 
delimiter ; 
1

Um dies zu tun, und haben es:

col1 TIMESTAMP DEFAULT 0, 

col2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 

Sie brauchen keinen Auslöser für col1, sicherzustellen, nur der Wert in der Abfrage NULL ist. Die Antwort finden Sie im Zertifizierungsleitfaden.

0

Standard TIMESTAMP wird in MySQL vor Versionen 5.6.1 in derselben Tabelle nicht unterstützt.

Nach der Version MySQL 5.6. + Erlaubt es zwei oder mehr TIMESTAMP-Spalten in der gleichen Tabelle.

können Sie versuchen, Ihre MySQL-Version zu aktualisieren