Pregunta ¿Cómo se establece un valor predeterminado para una columna MySQL Datetime?


¿Cómo se establece un valor predeterminado para una columna MySQL Datetime?

En SQL Server es getdate(). ¿Cuál es el equivalente para MySQL? Estoy usando MySQL 5.x si eso es un factor.


761
2017-10-03 20:24


origen


Respuestas:


EDITACIÓN IMPORTANTE: Ahora es posible lograr esto con los campos DATETIME desde MySQL 5.6.5, mira el otra publicación abajo...

Las versiones anteriores no pueden hacer eso con DATETIME ...

Pero puedes hacerlo con TIMESTAMP:

mysql> create table test (str varchar(32), ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
Query OK, 0 rows affected (0.00 sec)

mysql> desc test;
+-------+-------------+------+-----+-------------------+-------+
| Field | Type        | Null | Key | Default           | Extra |
+-------+-------------+------+-----+-------------------+-------+
| str   | varchar(32) | YES  |     | NULL              |       | 
| ts    | timestamp   | NO   |     | CURRENT_TIMESTAMP |       | 
+-------+-------------+------+-----+-------------------+-------+
2 rows in set (0.00 sec)

mysql> insert into test (str) values ("demo");
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;
+------+---------------------+
| str  | ts                  |
+------+---------------------+
| demo | 2008-10-03 22:59:52 | 
+------+---------------------+
1 row in set (0.00 sec)

mysql>

** CAVEAT: SI define una columna con CURRENT_TIMESTAMP ON como predeterminado, necesitará SIEMPRE especificar un valor para esta columna o el valor se restablecerá automáticamente a "now ()" en la actualización. Esto significa que si no desea que el valor cambie, su declaración UPDATE debe contener "[su nombre de columna] = [su nombre de columna]" (o algún otro valor) o el valor se convertirá en "ahora ()". Raro, pero cierto. Espero que esto ayude. Estoy usando 5.5.56-MariaDB **


750
2017-10-03 20:48



En la versión 5.6.5, es posible establecer un valor predeterminado en una columna de fecha y hora e incluso crear una columna que se actualizará cuando se actualice la fila. La definición de tipo:

CREATE TABLE foo (
    `creation_time`     DATETIME DEFAULT CURRENT_TIMESTAMP,
    `modification_time` DATETIME ON UPDATE CURRENT_TIMESTAMP
)

Referencia: http://optimize-this.blogspot.com/2012/04/datetime-default-now-finally-available.html


492
2018-05-15 14:44



MySQL (antes de la versión 5.6.5) no permite el uso de funciones para los valores predeterminados de DateTime. TIMESTAMP no es adecuado debido a su comportamiento extraño y no se recomienda su uso como datos de entrada. (Ver Valores predeterminados del tipo de datos MySQL.)

Dicho eso, puedes lograr esto creando un disparador.

Tengo una tabla con un campo DateCreated de tipo DateTime. Creé un disparador en esa tabla "Antes de Insertar" y "SET NEW.DateCreated=NOW()"y funciona genial"

Espero que esto ayude a alguien.


135
2017-09-27 17:04



Para mí, el enfoque de disparo ha funcionado mejor, pero encontré un inconveniente con el enfoque. Considere el disparador básico para establecer un campo de fecha a la hora actual en insertar:

CREATE TRIGGER myTable_OnInsert BEFORE INSERT ON `tblMyTable`
    FOR EACH ROW SET NEW.dateAdded = NOW();

Esto suele ser genial, pero supongamos que desea establecer el campo manualmente mediante la instrucción INSERT, de la siguiente manera:

INSERT INTO tblMyTable(name, dateAdded) VALUES('Alice', '2010-01-03 04:30:43');

Lo que ocurre es que el desencadenante sobrescribe inmediatamente el valor proporcionado para el campo, por lo que la única forma de establecer un tiempo no actual es una instrucción UPDATE de seguimiento: ¡puaj! Para anular este comportamiento cuando se proporciona un valor, pruebe este desencadenador ligeramente modificado con el operador IFNULL:

CREATE TRIGGER myTable_OnInsert BEFORE INSERT ON `tblMyTable`
    FOR EACH ROW SET NEW.dateAdded = IFNULL(NEW.dateAdded, NOW());

Esto le da lo mejor de ambos mundos: puede proporcionar un valor para su columna de fecha y se llevará a cabo, y de lo contrario será predeterminado a la hora actual. Todavía es un ghetto relativo a algo limpio como DEFAULT GETDATE () en la definición de la tabla, ¡pero nos estamos acercando!


127
2018-04-20 14:12



Pude resolver esto usando esta declaración alternativa en mi tabla que tenía dos campos de fecha y hora.

ALTER TABLE `test_table`
  CHANGE COLUMN `created_dt` `created_dt` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
  CHANGE COLUMN `updated_dt` `updated_dt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

Esto funciona como esperaría que funcione la función now (). Al insertar nulos o ignorar los campos created_dt y updated_dt, se obtiene un valor perfecto de marca de tiempo en ambos campos. Cualquier actualización de la fila cambia el updated_dt. Si insertas registros a través del buscador de consultas de MySQL necesitabas un paso más, un disparador para manejar el created_dt con una nueva marca de tiempo.

CREATE TRIGGER trig_test_table_insert BEFORE INSERT ON `test_table`
    FOR EACH ROW SET NEW.created_dt = NOW();

El desencadenador puede ser lo que quieras Me gusta la convención de nombres [trig] _ [mi_nombre_de_tabla] _ [inserte]


22
2018-02-12 17:44



Puedes usar disparadores para hacer este tipo de cosas.

CREATE TABLE `MyTable` (
`MyTable_ID`  int UNSIGNED NOT NULL AUTO_INCREMENT ,
`MyData`  varchar(10) NOT NULL ,
`CreationDate`  datetime NULL ,
`UpdateDate`  datetime NULL ,
PRIMARY KEY (`MyTable_ID`)
)
;

CREATE TRIGGER `MyTable_INSERT` BEFORE INSERT ON `MyTable`
FOR EACH ROW BEGIN
        -- Set the creation date
    SET new.CreationDate = now();

        -- Set the udpate date
    Set new.UpdateDate = now();
END;

CREATE TRIGGER `MyTable_UPDATE` BEFORE UPDATE ON `MyTable`
FOR EACH ROW BEGIN
        -- Set the udpate date
    Set new.UpdateDate = now();
END;

22
2018-06-22 17:32



Para todos aquellos que perdieron el corazón tratando de establecer un valor predeterminado FECHA Y HORA valor en MySQL, Sé exactamente cómo te sientes / sientes. Entonces aquí está es:

ALTER TABLE  `table_name` CHANGE `column_name` DATETIME NOT NULL DEFAULT 0

Observe cuidadosamente eso No he agregado comillas simples / comillas dobles alrededor de 0

Estoy literalmente saltando después de resolver este: D


13
2018-03-10 18:38



esto es realmente una noticia terrible.aquí hay una solicitud larga de error / función pendiente para este. esa discusión también habla sobre las limitaciones del tipo de datos de marca de tiempo.

Me estoy preguntando en serio cuál es el problema con lograr que esto se implemente.


12
2018-02-21 21:28



MySQL 5.6 ha solucionado este problema.

ALTER TABLE mytable CHANGE mydate datetime NOT NULL DEFAULT 'CURRENT_TIMESTAMP'

12
2017-08-06 10:13



Para todos los que utilicen la columna TIMESTAMP como solución, quiero duplicar la siguiente limitación del manual:

http://dev.mysql.com/doc/refman/5.0/en/datetime.html

"El tipo de datos TIMESTAMP tiene un rango de '1970-01-01 00:00:01' UTC a '2038-01-19 03:14:07' UTC. Tiene diferentes propiedades, dependiendo de la versión de MySQL y del modo SQL en el que se ejecuta el servidor. Estas propiedades se describen más adelante en esta sección. "

Esto obviamente romperá su software en aproximadamente 28 años.

Creo que la única solución en el lado de la base de datos es usar disparadores como se menciona en otras respuestas.


7
2017-12-07 14:31



Si ya ha creado la tabla, puede usar

Para cambiar el valor predeterminado a la fecha actual

ALTER TABLE <TABLE_NAME> 
CHANGE COLUMN <COLUMN_NAME> <COLUMN_NAME> DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;

Para cambiar el valor predeterminado a '2015-05-11 13:01:01'

ALTER TABLE <TABLE_NAME> 
CHANGE COLUMN <COLUMN_NAME> <COLUMN_NAME> DATETIME NOT NULL DEFAULT '2015-05-11 13:01:01';

7
2017-10-03 20:30