Tengo el siguiente esquema de tabla;
CREATE TABLE `db1`.`sms_queue` (
`Id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`Message` VARCHAR(160) NOT NULL DEFAULT 'Unknown Message Error',
`CurrentState` VARCHAR(10) NOT NULL DEFAULT 'None',
`Phone` VARCHAR(14) DEFAULT NULL,
`Created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`LastUpdated` TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP,
`TriesLeft` tinyint NOT NULL DEFAULT 3,
PRIMARY KEY (`Id`)
)
ENGINE = InnoDB;
Falla con el siguiente error:
ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause.
Mi pregunta es, ¿puedo tener ambos campos? ¿o tengo que configurar manualmente un campo LastUpdated durante cada transacción?
mysql
mysql-error-1293
Xenph Yan
fuente
fuente
Respuestas:
De la documentación de MySQL 5.5 :
Cambios en MySQL 5.6.5 :
fuente
Changes in MySQL 5.6.5 (2012-04-10, Milestone 8) Previously, at most one TIMESTAMP column per table could be automatically initialized or updated to the current date and time. This restriction has been lifted. Any TIMESTAMP column definition can have any combination of DEFAULT CURRENT_TIMESTAMP and ON UPDATE CURRENT_TIMESTAMP clauses. In addition, these clauses now can be used with DATETIME column definitions. For more information, see Automatic Initialization and Updating for TIMESTAMP and DATETIME.
Hay un truco para tener ambas marcas de tiempo, pero con una pequeña limitación.
Puede usar solo una de las definiciones en una tabla. Cree ambas columnas de marca de tiempo de la siguiente manera:
Tenga en cuenta que es necesario ingresar
null
en ambas columnas duranteinsert
:fuente
stamp_created
también esté configurado como NO NULO. MySQL reemplazará automáticamente el NULL con la marca de tiempo actual.stamp_created
campo como: enstamp_created timestamp default now()
lugar de usar un valor 'CERO'?Puede tenerlos a ambos, simplemente quite la bandera "CURRENT_TIMESTAMP" en el campo creado. Siempre que cree un nuevo registro en la tabla, simplemente use "NOW ()" para obtener un valor.
O.
Por el contrario, elimine el indicador 'ON UPDATE CURRENT_TIMESTAMP' y envíe el NOW () para ese campo. Esa forma en realidad tiene más sentido.
fuente
Si decide que MySQL maneje la actualización de las marcas de tiempo, puede configurar un activador para actualizar el campo en la inserción.
Referencia de MySQL: http://dev.mysql.com/doc/refman/5.0/en/triggers.html
fuente
Así es como puede tener campos createDate / lastModified automáticos y flexibles usando disparadores:
Primero defínalos así:
Luego agregue estos desencadenantes:
Pero aquí está la buena parte:
fuente
A partir de MySQL 5.6 es muy fácil ... pruébalo:
fuente
Este problema parecía haberse resuelto en MySQL 5.6. He notado esto hasta MySQL 5.5; Aquí hay un código de ejemplo:
Ejecutar esto en MySQL 5.5 da:
Ejecutando esto en MySQL 5.6
fuente
fuente: http://gusiev.com/2009/04/update-and-create-timestamps-with-mysql/
fuente
Para mysql 5.7.21 utilizo lo siguiente y funciona bien:
CREATE TABLE
Posts
(modified_at
marca de tiempo NO NULL DEFAULT CURRENT_TIMESTAMP EN UPDATE CURRENT_TIMESTAMP,created_at
marca de tiempo NOT NULL DEFAULT CURRENT_TIMESTAMP)fuente
Creo que esta es la mejor consulta para stamp_created y stamp_updated
porque cuando se crea el registro,
stamp_created
debe llenarsenow()
ystamp_updated
debe llenarse'0000-00-00 00:00:00'
fuente
Mi proveedor de alojamiento web está atascado en la versión 5.1 de mysql, por lo que cualquiera como yo que no tenga la opción de actualizar puede seguir estas instrucciones:
http://joegornick.com/2009/12/30/mysql-created-and-modified-date-fields/
fuente