2014-03-04 14 views
7

Ich habe vor kurzem entschieden, MySQL Trigger für meine created und modified Datumsfelder in meinen Tabellen wegen Komplikationen bei der Ausführung von Skripts in der Setup-Datei auf Client-Bereitstellung enthalten zu stoppen. (Beispiel)MySQL Timestamp Felder - erstellt/geändert

jetzt
alter table users 
modify `created` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00' 

alter table users 
modify `modified` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP 
     ON UPDATE CURRENT_TIMESTAMP 

Wenn ich mein Programm laufen und ein Formular ausfüllen, Daten hinzuzufügen (Formular-Steuerelemente sind Databound), ich die Meldung „Spalte 'erhalten:

Ich habe die Felder auf diese Weise verändert erstellt "erlaubt keine Nullen".

Bei bereits vorhandenen Daten, wenn ich versuche zu aktualisieren, ändert sich das Änderungsdatum einfach nicht.

Ich habe viele Artikel wie Having both a Created and Last Updated timestamp columns in MySQL 4.0 angesehen, kann aber keine Lösung finden.

Wie löse ich das?

Ich verwende MySQL v 5.6.15.0

Antwort

0

den Fahrer je nach dem 0000-00-00 Datum als null behandelt werden könnte, die für Ihre Spaltendefinition nicht gültig ist. Aber wenn das nicht der Fall war, jedes Datum vor 1970 ist auch kein gültiger Zeitstempel.

Ich würde versuchen, die Definition „erstellt“, wie DATETIME- statt STAMP

alter table users modify `created` DATETIME NOT NULL DEFAULT '1000-01-01 00:00:00' 

(Das ist das niedrigste Datum ein DATETIME- dauern kann). Warum die modifizierte Spalte nicht funktioniert, ist Teil desselben Problems. Tabellen sollen nur eine Zeitstempelspalte haben, aber wenn Sie zwei oder mehr setzen, kann nur der erste CURRENT_TIMESTAMP haben. Silly Mysql Einschränkungen.

Diese Einschränkung wird in der zukünftigen Version aufgehoben werden, aber ich denke, deine hat das noch nicht.

+0

Vielen Dank für Ihre Antwort. Die Version, die ich verwende, ist die neueste für die Entwicklung von Visual Studio. Ich habe das erstellte Feld wie angegeben geändert. Leider habe ich immer noch die gleichen Probleme. Könnten es die C# -Datensätze sein, die ich verwende? –

2

ändern

alter table users modify 
    `created` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00' 

An:

alter table users modify 
    `created` TIMESTAMP NOT NULL DEFAULT now() 

Oder:

alter table users modify 
    `created` TIMESTAMP NOT NULL DEFAULT current_timestamp 
4
ALTER TABLE 'my_table' 
CHANGE `created` TIMESTAMP DEFAULT 0, 
CHANGE `modified` TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 

Aber achten Sie darauf, die 'added_date' Spalte NULL explizit festgelegt, während die Daten einfügen

01 Hier

ist ein Beispiel:

mysql> CREATE TABLE ts_test5 (
-> created TIMESTAMP DEFAULT 0, 
-> updated TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
-> data CHAR(30) 
->); 
Query OK, 0 rows affected (0.01 sec) 

mysql> INSERT INTO ts_test5 (created, data) 
-> VALUES (NULL, ‘original_value’); 
Query OK, 1 row affected (0.00 sec) 

mysql> SELECT * FROM ts_test5; 
+---------------------+---------------------+----------------+ 
| created    |updated    |data   | 
+---------------------+---------------------+----------------+ 
| 2005-01-04 14:47:39 | 0000-00-00 00:00:00 | original_value | 
+---------------------+---------------------+----------------+ 
1 row in set (0.00 sec) 

mysql> . . . time passes . . . 

mysql> UPDATE ts_test5 SET data=’updated_value’; 
Query OK, 1 row affected (0.00 sec) 
Rows matched: 1 
Changed: 1 
Warnings: 0 

mysql> SELECT * FROM ts_test5; 
+---------------------+---------------------+---------------+ 
| created    |updated    |data   | 
+---------------------+---------------------+---------------+ 
| 2005-01-04 14:47:39 | 2005-01-04 14:47:52 | updated_value | 
+---------------------+---------------------+---------------+ 
1 row in set (0.00 sec) 
+0

Danke für Ihre Antwort. Ich benutze Datensätze, um meine Daten hinzuzufügen oder zu aktualisieren, keine gemachten Abfragen. ZB.usersTableAdapter.Update (this.payrollDataSet.users); this.payrollDataSet.users.AcceptChanges(); –