¿Cómo 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.
¿Cómo 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.
Respuestas:
EDICIÓN IMPORTANTE: ahora es posible lograr esto con los campos DATETIME desde MySQL 5.6.5 , eche un vistazo a la otra publicación a continuación ...
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 por defecto, SIEMPRE necesitará 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 instrucción UPDATE debe contener "[su nombre de columna] = [su nombre de columna]" (o algún otro valor) o el valor se convertirá en "ahora ()". Extraño, pero cierto. Espero que esto ayude. Estoy usando 5.5.56-MariaDB **
DATE
columna? (no una datetime
columna)
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 del 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
dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
MySQL ( antes de la versión 5.6.5 ) no permite que se usen 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. (Consulte Valores predeterminados del tipo de datos MySQL ).
Dicho esto, puedes lograr esto creando un Trigger .
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 muy bien.
Espero que esto ayude a alguien.
IF NEW.created_at IS NOT NULL
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 la inserción:
CREATE TRIGGER myTable_OnInsert BEFORE INSERT ON `tblMyTable`
FOR EACH ROW SET NEW.dateAdded = NOW();
Esto suele ser genial, pero digamos que desea establecer el campo manualmente a través de la instrucción INSERT, así:
INSERT INTO tblMyTable(name, dateAdded) VALUES('Alice', '2010-01-03 04:30:43');
Lo que sucede es que el activador sobrescribe inmediatamente el valor proporcionado para el campo, por lo que la única forma de establecer una hora no actual es una declaración de ACTUALIZACIÓN de seguimiento: ¡qué asco! Para anular este comportamiento cuando se proporciona un valor, pruebe este disparador 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 brinda lo mejor de ambos mundos: puede proporcionar un valor para su columna de fecha y tomará, y de lo contrario, se establecerá de manera predeterminada a la hora actual. Todavía es un ghetto en relación con algo limpio como DEFAULT GETDATE () en la definición de la tabla, ¡pero nos estamos acercando!
NULL
. No hay advertencias más.
dateAdded
se mostrarán todos los '0000-00-00 00:00:00'. Usar esto hace el truco: `PARA CADA FILA SI ES NUEVO. DateAdded = 0 LUEGO ESTABLECE NEW.dateAdded = NOW (); END IF; `
Pude resolver esto usando esta declaración alter 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 es de esperar que funcione la función now (). Insertar nulos o ignorar los campos created_dt y updated_dt da como resultado un valor de marca de tiempo perfecto en ambos campos. Cualquier actualización de la fila cambia el updated_dt. Si inserta registros a través del navegador de consultas MySQL, necesita un paso más, un activador 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 Simplemente me gusta la convención de nomenclatura [trig] _ [my_table_name] _ [insert]
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;
Para todos aquellos que se desanimaron tratando de establecer un valor DATETIME predeterminado en MySQL , sé exactamente cómo se siente / sintió. Entonces aquí está:
ALTER TABLE `table_name` CHANGE `column_name` DATETIME NOT NULL DEFAULT 0
Observe cuidadosamente que no he agregado comillas simples / comillas dobles alrededor del 0
Estoy literalmente saltando después de resolver este: D
ALTER TABLE zones MODIFY created datetime NOT NULL DEFAULT 0;
MySQL 5.6 ha solucionado este problema .
ALTER TABLE mytable CHANGE mydate datetime NOT NULL DEFAULT 'CURRENT_TIMESTAMP'
Si ya ha creado la tabla, puede usar
Para cambiar el valor predeterminado a la fecha y hora 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';
Esta es una noticia terrible. Aquí hay una solicitud de error / función pendiente por mucho tiempo para esto . esa discusión también habla sobre las limitaciones del tipo de datos de marca de tiempo.
Me pregunto seriamente cuál es el problema con implementar esto.
Estoy ejecutando MySql Server 5.7.11 y esta oración:
ALTER TABLE table_name CHANGE date_column datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
es no trabajar. Pero lo siguiente:
ALTER TABLE table_name CHANGE date_column datetime NOT NULL DEFAULT '1000-01-01 00:00:00'
solo funciona .
Como nota al margen , se menciona en los documentos de mysql :
El tipo DATE se usa para valores con una parte de fecha pero sin parte de tiempo. MySQL recupera y muestra los valores de FECHA en formato 'AAAA-MM-DD'. El rango admitido es '1000-01-01' a '9999-12-31'.
incluso si también dicen:
Los valores DATE, DATETIME o TIMESTAMP no válidos se convierten al valor "cero" del tipo apropiado ('0000-00-00' o '0000-00-00 00:00:00').
Puede usar now () para establecer el valor de una columna de fecha y hora, pero tenga en cuenta que no puede usarlo como valor predeterminado.
NOW()
y utilícelo más tarde para la inserción. Para la versión 5.6, simplemente establezca NOW()
el valor predeterminado.
Para todos los que usan la columna TIMESTAMP como solución, quiero secundar 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 propiedades variables, dependiendo de la versión de MySQL y el SQL modo en el que se ejecuta el servidor. Estas propiedades se describen más adelante en esta sección ".
Obviamente, esto 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.
Al definir disparadores de líneas múltiples, uno tiene que cambiar el delimitador, ya que el compilador MySQL tomará el punto y coma como final del disparador y generará un error. p.ej
DELIMITER //
CREATE TRIGGER `MyTable_UPDATE` BEFORE UPDATE ON `MyTable`
FOR EACH ROW BEGIN
-- Set the udpate date
Set new.UpdateDate = now();
END//
DELIMITER ;
Aquí se explica cómo hacerlo en MySQL 5.1:
ALTER TABLE `table_name` CHANGE `column_name` `column_name`
TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
No tengo idea de por qué debe ingresar el nombre de la columna dos veces.
Si bien no puede hacer esto con DATETIME
la definición predeterminada, simplemente puede incorporar una declaración de selección en su declaración de inserción de esta manera:
INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))
Tenga en cuenta la falta de comillas alrededor de la mesa.
Para MySQL 5.5
Si está intentando establecer el valor predeterminado como AHORA (), no creo que MySQL lo admita. En MySQL, no puede usar una función o una expresión como valor predeterminado para ningún tipo de columna, excepto para la columna de tipo de datos TIMESTAMP, para la cual puede especificar CURRENT_TIMESTAMP como predeterminado.
Creo que es simple en mysql ya que mysql es la función incorporada llamada now () que proporciona la hora actual (hora de esa inserción).
Entonces su consulta debería verse de manera similar
CREATE TABLE defaultforTime(
`creation_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
`modification_time` DATETIME default now()
);
Gracias.
CREATE TABLE `testtable` (
`id` INT(10) NULL DEFAULT NULL,
`colname` DATETIME NULL DEFAULT '1999-12-12 12:12:12'
)
En la consulta anterior para crear 'testtable', usé '1999-12-12 12:12:12' como valor predeterminado para la columna DATETIME colname
Usa el siguiente código
DELIMITER $$
CREATE TRIGGER bu_table1_each BEFORE UPDATE ON table1 FOR EACH ROW
BEGIN
SET new.datefield = NOW();
END $$
DELIMITER ;
Si está intentando establecer el valor predeterminado como AHORA (), MySQL admite que debe cambiar el tipo de esa columna TIMESTAMP en lugar de DATETIME. TIMESTAMP tiene la fecha y hora actuales como predeterminadas ... creo que resolverá su problema ...
Tomemos, por ejemplo, si tuviera una tabla llamada 'sitio' con una columna created_at y update_at que fueran DATETIME y necesiten el valor predeterminado de ahora, podría ejecutar el siguiente sql para lograr esto.
ALTER TABLE `site` CHANGE` created_at` `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP; ALTER TABLE `site` CHANGE` created_at` `created_at` DATETIME NULL DEFAULT NULL; ALTER TABLE `site` CHANGE` updated_at` `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP; ALTER TABLE `site` CHANGE` updated_at` `updated_at` DATETIME NULL DEFAULT NULL;
La secuencia de declaraciones es importante porque una tabla no puede tener dos columnas de tipo TIMESTAMP con valores predeterminados de CUREENT TIMESTAMP
Este es mi ejemplo de activación:
/************ ROLE ************/
drop table if exists `role`;
create table `role` (
`id_role` bigint(20) unsigned not null auto_increment,
`date_created` datetime,
`date_deleted` datetime,
`name` varchar(35) not null,
`description` text,
primary key (`id_role`)
) comment='';
drop trigger if exists `role_date_created`;
create trigger `role_date_created` before insert
on `role`
for each row
set new.`date_created` = now();
Trabajando bien con MySQL 8.x
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`dateCreated` datetime DEFAULT CURRENT_TIMESTAMP,
`dateUpdated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `mobile_UNIQUE` (`mobile`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
Puede resolver la marca de tiempo predeterminada. Primero considere qué juego de caracteres está utilizando, por ejemplo, si tomó utf8, este juego de caracteres admite todos los idiomas y si tomó late1 este juego de caracteres solo admite inglés. Luego, si está trabajando en algún proyecto, debe conocer la zona horaria del cliente y seleccionar la zona del cliente. Este paso es obligatorio.