2009-09-22 17 views
6

Tengo tabla como se muestra a continuación. Con el fin de solucionar un defecto ahora restricción de la columna de MySQL utilicé la punta, como se muestra hereMySQL columna de indicación de fecha y hora valor predeterminado AHORA valor ERROR 1067

CREATE TABLE IF NOT EXISTS mytable (
    id INT NOT NULL AUTO_INCREMENT , 
    create_date TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00' , 
    update_date TIMESTAMP NULL DEFAULT NOW() ON UPDATE NOW() , 
    PRIMARY KEY (`parti_id`)) 
ENGINE = InnoDB; 

Mi sql_mode no incluye NO_ZERO_DATE como se ha señalado here mi producción:

mysql> SELECT @@sql_mode; 
+------------+ 
| @@sql_mode | 
+------------+ 
|   | 
+------------+ 
1 row in set (0.00 sec) 

Todavía está dando el error como se muestra a continuación:

ERROR 1067 (42000) at line xx in file: '/myschema.sql': Invalid default value for 'create_date' 

Yo uso MySQL 5.1.37 en Ubuntu

¿Cómo puedo solucionarlo? Gracias.

Respuesta

12

Sólo puede tener una columna de marca de tiempo que por defecto es CURRENT_TIMESTAMP o NOW() por mesa. Este es un error bien conocido en MySQL.

Para solucionar esto, establezca un valor de marca de tiempo válido para la columna creada y luego inserte la marca de tiempo en el código de la aplicación CRUD. Use NOW() o CURRENT_TIMESTAMP para la columna predeterminada.

material de

Referencia: http://dev.mysql.com/doc/refman/5.1/en/timestamp.html

Para ilustrar adicionalmente deficiencia de MySQL en esta área, considere el siguiente código:

CREATE TABLE testing_timestamps (
    id INT NOT NULL AUTO_INCREMENT, 
    pk_id INT NOT NULL, 
    col1 TIMESTAMP DEFAULT 0, 
    col2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY(id) 
); 

delimiter $$ 
CREATE TRIGGER testing_timestamps_trigger 
    AFTER INSERT ON testing_timestamps 
    FOR EACH ROW 
    BEGIN 
    UPDATE testing_timestamps SET col1 = NOW() WHERE id = MAX(id); 
    END; 
$$ 
delimiter ; 

INSERT INTO testing_timestamps (id) VALUES (0); 

La salida de esta pantalla:

mysql> INSERT INTO testing_timestamps (id) VALUES (0); 
ERROR 1442 (HY000): Can't update table 'testing_timestamps' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 

Este es un fastidio porque usar un gatillo en este caso sería un buen trabajo.

+0

Esto no es un error, es una característica: "Para una columna TIMESTAMP en una tabla, puede asignar la fecha y hora actual como el valor por defecto y el valor de actualización automática Es posible que la marca de tiempo actual sea el valor predeterminado para inicializar la columna, para el valor de actualización automática o para ambos. No es posible que la marca de tiempo actual sea el valor predeterminado para una columna y el valor de actualización automática para otra columna. " –

+0

El debate sobre si esto es un 'error' o no se mantiene, ya que esto es realmente molesto. ¿Por qué no puedo tener dos columnas timestamp con un valor predeterminado de now() con la segunda columna de actualización automática? La respuesta es que MySQL no hace eso. Realmente no lo llamo una característica. –

+0

Randy gracias por su respuesta. Estoy al tanto del enlace que me proporcionó. Solo busco una solución. Sin embargo, parece que todos los trucos que se muestran en Internet simplemente no funcionan. –

7

En realidad, el código de Randy está roto. No funcionará porque es un disparador mutante. No puede actualizar la tabla que inició la actualización. Por ejemplo, si está actualizando la tabla SESIONES, no puede ir a modificar la tabla en su desencadenante utilizando una instrucción UPDATE, INSERT o DELETE. La única manera en que se le permite modificar la tabla a la que está conectado el desencadenador es usar los prefijos "NUEVO" o "ANTIGUO" como se muestra a continuación. (Por supuesto, puede actualizar otras tablas a voluntad.) Aquí hay un ejemplo de cómo superar el problema descrito por el op.

create table sessions (
    id integer not null, 
    created timestamp not null default 0, 
    updated timestamp not null default 0 
); 

delimiter // 
create trigger bifer_sessions_ts before insert on sessions for each row 
begin 
    set new.created = now(); 
    set new.updated = now(); 
end; 
// 
create trigger bufer_sessions_ts before update on sessions for each row 
begin 
    set new.updated = now(); 
end; 
// 
delimiter ; 
1

Para hacer esto y hacer que funcione:

col1 TIMESTAMP DEFAULT 0, 

col2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 

que no es necesario un disparador para col1, simplemente asegurar el valor es NULL en la consulta. La respuesta está en la guía de certificación.

0

El TIMESTAMP predeterminado no se admite en MySQL antes que las versiones 5.6.1 en la misma tabla.

Después de la versión MySQL 5.6. + Permite dos o más columnas TIMESTAMP en la misma tabla.

Usted puede tratar de actualizar su versión de MySQL

Cuestiones relacionadas