2012-03-17 8 views
13

Cuando creo una tabla con una columna de marca de tiempo, esa columna se define mágicamente como NO NULA PREDETERMINADA CURRENT_TIMESTAMP en la actualización CURRENT_TIMESTAMP. Ignorando cuán raro es esto hasta ahora, me gustaría cambiarlo para que no tenga ningún comportamiento predeterminado ni especial de "actualización".¿Es posible definir una columna de marca de tiempo que no sea nula y no tenga ningún valor predeterminado ni comportamiento especial en la actualización?

Descubrí que si cambio la columna para que sea NULL, el valor predeterminado se establece mágicamente en NULL y la "actualización" desaparece mágicamente. Esto es genial, sin embargo, me gustaría que la columna NO sea NULA. Cuando lo cambio, tanto el valor predeterminado como "en la actualización" (establecido en CURRENT_TIMESTAMP) vuelven a aparecer mágicamente.

Sé que podría usar datetime en lugar de indicación de fecha y hora, pero estoy interesado en la marca de tiempo porque reconoce la zona horaria (parece ser como "indicación de fecha y hora con zona horaria" en Postgres).

Respuesta

-1

No hace mucho encontré una solución realmente buena que puede ayudarle. Disable ON UPDATE

5

Las columnas de marca de tiempo son un caso especial. Ver here: Por defecto, las columnas TIMESTAMP NO SON NULAS, no pueden contener valores NULOS, y la asignación de NULL asigna la marca de tiempo actual.

Para obtener información más detallada, consulte Data Type Default Values.

Específicamente esa situación se aplica cuando no se ejecuta en modo estricto. Si se ejecuta en modo estricto, al insertar un NULL arrojará un error.

Esto debe cuidar de él:

ALTER TABLE tableName ALTER COLUMN columnName DROP DEFAULT; 

Si eso no funciona, haciendo esto que se supone que te dejará con el valor por defecto (fácilmente sobrescribe) pero quitar la actualización en:

ALTER TABLE tableName CHANGE columnName columnName NOT NULL DEFAULT CURRENT_TIMESTAMP; 

Tenga en cuenta el nombre de la columna repetida.

+1

Hmm, interesante. Pude hacer esto: 'alter table tstest modificar ts timestamp not null default 0;' y luego: 'alterar tabla tstest alterar columna ts drop default;' Eso parece dar los resultados que quería. Me pregunto si hay una manera más directa, idealmente en la declaración create table. – aditsu

+0

Así que por ahora puedo hacerlo en 2 pasos: crear una tabla (con 0 predeterminado) y luego soltar el valor predeterminado. Pero lo extraño es que si intento insertar un valor nulo, todavía usa la marca de tiempo actual (y si no especifico un valor, usa 0). mysql, ¿no tienes sentido? – aditsu

+0

Parece ser un caso especial. Ver [aquí] (http://dev.mysql.com/doc/refman/5.1/en/timestamp-initialization.html): _Por defecto, las columnas TIMESTAMP NO son NULL, no pueden contener valores NULL, y la asignación de NULL asigna la actual timestamp._ – Ilion

Cuestiones relacionadas