una tipo tener tabla sólo puede error columna mysql timestamp mysql-error-1293

tipo - mysql error 1293 timestamp



¿Por qué solo puede haber una columna TIMESTAMP con CURRENT_TIMESTAMP en la cláusula DEFAULT? (9)

  1. Cambiar los tipos de datos de las columnas a datetime
  2. Establecer disparador

Como:

DROP TRIGGER IF EXISTS `update_tablename_trigger`; DELIMITER // CREATE TRIGGER `update_tablename_trigger` BEFORE UPDATE ON `tablename` FOR EACH ROW SET NEW.`column_name` = NOW() // DELIMITER ;

¿Por qué solo puede haber una columna TIMESTAMP con CURRENT_TIMESTAMP en la cláusula DEFAULT o ON UPDATE?

CREATE TABLE `foo` ( `ProductID` INT(10) UNSIGNED NOT NULL, `AddedDate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, `UpdatedDate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=INNODB;

El error que resulta:

Código de error: 1293

Definición incorrecta de la tabla; solo puede haber una columna TIMESTAMP con CURRENT_TIMESTAMP en cláusula DEFAULT o ON UPDATE


Bueno, una solución para usted podría ser colocarlo en el campo FechaPredeterminada y tener un desencadenador que actualice el campo FechaAñadida con el valor ActualizadoFalto solo si FechaPreferente es nulo.


De hecho, una falla de implementación.

El enfoque nativo en MySQL es actualizar usted mismo una fecha de creación (si necesita una) y ¿le preocupa a MySQL la update date ? update date : creation date la marca de tiempo update date ? update date : creation date update date ? update date : creation date así:

CREATE TABLE tracked_data( `data` TEXT, `timestamp` TIMESTAMP, `creation_date` TIMESTAMP ) ENGINE=INNODB;

En la creación Insertar NULL:

INSERT INTO tracked_data(`data`,`creation_date`) VALUES (''creation..'',NULL);

Los valores NULL para timestamp se intercalan como CURRENT_TIMESTAMP de manera predeterminada.

En MySQL, la primera columna TIMESTAMP de una tabla obtiene los atributos DEFAULT CURRENT_TIMESTAMP y ON UPDATE CURRENT_TIMESTAMP , si no se le otorgan atributos. esta es la razón por la cual la columna TIMESTAMP con atributos debe ser lo primero o se obtiene el error descrito en este hilo.


Esta es la limitación en la versión MYSQL 5.5. Debe actualizar la versión a 5.6.

Error

Estaba obteniendo este error al agregar una tabla en MYSQL

Definición incorrecta de la tabla; solo puede haber una columna TIMESTAMP con CURRENT_TIMESTAMP en cláusula DEFAULT o ON UPDATE Mi nuevo MYSQL

mesa se ve algo como esto.

create table nombre_tabla (col1 int (5) auto_increment clave principal, col2 varchar (300), col3 varchar (500), col4 int (3), col5 tinyint (2), col6 sello de tiempo valor_actualización_actualización predeterminada, col7 sello de tiempo valor predeterminado current_timestamp en la actualización current_timestamp, col8 tinyint (1) predeterminado 0, col9 tinyint (1) predeterminado 1);

Después de un tiempo de leer acerca de los cambios en diferentes versiones de MySQL y algunos de los de Google. Descubrí que se realizaron algunos cambios en la versión 5.6 de MYSQL sobre la versión 5.5.

Este artículo te ayudará a resolver el problema. http://www.oyewiki.com/MYSQL/Incorrect-table-definition-there-can-be-only-one-timestamp-column


Esta limitación, que solo se debe a motivos históricos heredados del código, se ha eliminado en versiones recientes de MySQL:

Cambios en MySQL 5.6.5 (2012-04-10, Milestone 8)

Anteriormente, como máximo, una columna TIMESTAMP por tabla se podía inicializar o actualizar automáticamente a la fecha y hora actual. Esta restricción ha sido levantada. Cualquier definición de columna TIMESTAMP puede tener cualquier combinación de cláusulas DEFAULT CURRENT_TIMESTAMP y ON UPDATE CURRENT_TIMESTAMP. Además, estas cláusulas ahora se pueden usar con las definiciones de columna DATETIME. Para obtener más información, vea Inicialización automática y actualización para TIMESTAMP y DATETIME.

http://dev.mysql.com/doc/relnotes/mysql/5.6/en/news-5-6-5.html


Podemos dar un valor predeterminado para la marca de tiempo para evitar este problema.

Esta publicación ofrece una solución alternativa: http://gusiev.com/2009/04/update-and-create-timestamps-with-mysql/

create table test_table( id integer not null auto_increment primary key, stamp_created timestamp default ''0000-00-00 00:00:00'', stamp_updated timestamp default now() on update now() );

Tenga en cuenta que es necesario ingresar valores nulos en ambas columnas durante la "inserción":

mysql> insert into test_table(stamp_created, stamp_updated) values(null, null); Query OK, 1 row affected (0.06 sec) mysql> select * from t5; +----+---------------------+---------------------+ | id | stamp_created | stamp_updated | +----+---------------------+---------------------+ | 2 | 2009-04-30 09:44:35 | 2009-04-30 09:44:35 | +----+---------------------+---------------------+ 2 rows in set (0.00 sec) mysql> update test_table set id = 3 where id = 2; Query OK, 1 row affected (0.05 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from test_table; +----+---------------------+---------------------+ | id | stamp_created | stamp_updated | +----+---------------------+---------------------+ | 3 | 2009-04-30 09:44:35 | 2009-04-30 09:46:59 | +----+---------------------+---------------------+ 2 rows in set (0.00 sec)


Prueba esto:

CREATE TABLE `test_table` ( `id` INT( 10 ) NOT NULL, `created_at` TIMESTAMP NOT NULL DEFAULT 0, `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE = INNODB;


También me pregunté eso hace mucho tiempo. Busqué un poco en mi historial y creo que esta publicación: http://lists.mysql.com/internals/34919 representa la posición semioficial de MySQL (antes de la intervención de Oracle;))

En breve:

Esta limitación proviene solo de la forma en que esta característica se implementa actualmente en el servidor y no existen otros motivos para su existencia.

Entonces su explicación es "porque se implementa así". No suena muy científico Supongo que todo proviene de un código antiguo. Esto se sugiere en el subproceso anterior: "arrastre desde cuando solo el primer campo de marca de tiempo se configuró automáticamente / actualizó".

¡Aclamaciones!


Combinando varias respuestas:

En MySQL 5.5, DEFAULT CURRENT_TIMESTAMP y ON UPDATE CURRENT_TIMESTAMP no se pueden agregar el DATETIME pero solo en TIMESTAMP .

Reglas:

1) como máximo, una columna TIMESTAMP por tabla podría ser automáticamente (o manualmente [ Mi adición ]) inicializada o actualizada a la fecha y hora actual. (Documentos de MySQL).

Entonces, solo un TIMESTAMP puede tener CURRENT_TIMESTAMP en cláusula DEFAULT o ON UPDATE

2) La primera columna NOT NULL TIMESTAMP sin un valor DEFAULT explícito como created_date timestamp default ''0000-00-00 00:00:00'' recibirá implícitamente un DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP y, por lo tanto, las columnas TIMESTAMP subsiguientes no se pueden dar CURRENT_TIMESTAMP en DEFAULT o la cláusula ON UPDATE

CREATE TABLE `address` ( `id` int(9) NOT NULL AUTO_INCREMENT, `village` int(11) DEFAULT NULL, `created_date` timestamp default ''0000-00-00 00:00:00'', -- Since explicit DEFAULT value that is not CURRENT_TIMESTAMP is assigned for a NOT NULL column, -- implicit DEFAULT CURRENT_TIMESTAMP is avoided. -- So it allows us to set ON UPDATE CURRENT_TIMESTAMP on ''updated_date'' column. -- How does setting DEFAULT to ''0000-00-00 00:00:00'' instead of CURRENT_TIMESTAMP help? -- It is just a temporary value. -- On INSERT of explicit NULL into the column inserts current timestamp. -- `created_date` timestamp not null default ''0000-00-00 00:00:00'', // same as above -- `created_date` timestamp null default ''0000-00-00 00:00:00'', -- inserting ''null'' explicitly in INSERT statement inserts null (Ignoring the column inserts the default value)! -- Remember we need current timestamp on insert of ''null''. So this won''t work. -- `created_date` timestamp null , // always inserts null. Equally useless as above. -- `created_date` timestamp default 0, // alternative to ''0000-00-00 00:00:00'' -- `created_date` timestamp, -- first ''not null'' timestamp column without ''default'' value. -- So implicitly adds DEFAULT CURRENT_TIMESTAMP and ON UPDATE CURRENT_TIMESTAMP. -- Hence cannot add ''ON UPDATE CURRENT_TIMESTAMP'' on ''updated_date'' column. `updated_date` timestamp null on update current_timestamp, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=132 DEFAULT CHARSET=utf8;

INSERT INTO address (village,created_date) VALUES (100,null);

mysql> select * from address; +-----+---------+---------------------+--------------+ | id | village | created_date | updated_date | +-----+---------+---------------------+--------------+ | 132 | 100 | 2017-02-18 04:04:00 | NULL | +-----+---------+---------------------+--------------+ 1 row in set (0.00 sec)

UPDATE address SET village=101 WHERE village=100;

mysql> select * from address; +-----+---------+---------------------+---------------------+ | id | village | created_date | updated_date | +-----+---------+---------------------+---------------------+ | 132 | 101 | 2017-02-18 04:04:00 | 2017-02-18 04:06:14 | +-----+---------+---------------------+---------------------+ 1 row in set (0.00 sec)

Otra opción (pero updated_date es la primera columna):

CREATE TABLE `address` ( `id` int(9) NOT NULL AUTO_INCREMENT, `village` int(11) DEFAULT NULL, `updated_date` timestamp null on update current_timestamp, `created_date` timestamp not null , -- implicit default is ''0000-00-00 00:00:00'' from 2nd timestamp onwards -- `created_date` timestamp not null default ''0000-00-00 00:00:00'' -- `created_date` timestamp -- `created_date` timestamp default ''0000-00-00 00:00:00'' PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=132 DEFAULT CHARSET=utf8;