[MySQL] Análisis de parámetro explícito_defaults_for_timestamp

Cuando este parámetro se establece en OFF por defecto, su comportamiento es el siguiente:

  • De forma predeterminada, si la columna de marca de tiempo no especifica explícitamente el atributo nulo, entonces la columna se agregará automáticamente con el atributo no nulo (y si otros tipos de columnas no se especifican explícitamente como no nulos, se permiten valores nulos) , Si inserta un valor nulo en esta columna, automáticamente establecerá el valor de esta columna en el valor de la marca de tiempo actual.

  • Para la primera columna de marca de tiempo de la tabla, si no se especifica el atributo nulo o no se especifica el valor predeterminado, y no se especifica la instrucción ON UPDATE. Luego, la columna se agregará automáticamente los atributos DEFAULT CURRENT_TIMESTAMP y ON UPDATE CURRENT_TIMESTAMP.

  • Para otras columnas TIMESTAMP, si los atributos NULL y DEFAULT especificados no se muestran, se establecerá automáticamente en NOT NULL DEFAULT '0000-00-00 00:00:00'. (Por supuesto, esto está relacionado con SQL_MODE. Si SQL_MODE contiene 'NO_ZERO_DATE', en realidad no está permitido establecer su valor predeterminado en '0000-00-00 00:00:00').

mysql> muestra variables como 'explicit_defaults_for_timestamp'; 
+ --------------------------------- + ------- + 
| Variable_name | Valor | 
+ --------------------------------- + ------- + 
| explícita_defaults_for_timestamp | APAGADO | 
+ --------------------------------- + ------- + 
 
mysql> crear tabla t1  
    -> ( 
    -> marca de tiempo ts1, 
    -> marca de tiempo ts2, 
    -> marca de tiempo ts3 predeterminada '2010-01-01 00:00:00' 
    ->); 
Consulta OK, 0 filas afectadas (0.03 seg) 
 
mysql> show create table t1 \ G 
************************** 1. fila ** ************************* 
       Tabla: t1 
Crear tabla: CREAR TABLA `t1` (
  `ts1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
  ` ts2` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 
  `ts3` timestamp NOT NULL DEFAULT '2010-01-01 00:00:00 ' 
) ENGINE = InnoDB DEFAULT CHARSET = utf8 
1 fila en el conjunto (0.00 seg) 
 
mysql> insertar en los valores t1 (nulo, nulo, nulo); 
Consulta OK, 1 fila afectada (0.00 seg) 
 
mysql> seleccione * de t1; 
+ --------------------- + --------------------- + ----- ---------------- + 
| ts1 | ts2 | ts3 | 
+ --------------------- + --------------------- + ----- ---------------- +  
| 2019-04-09 15:54:56 | 2019-04-09 15:54:56 | 2019-04-09 15:54:56 |
+ --------------------- + ---------- ----------- + --------------------- + 
1 fila en conjunto (0.00 seg)

Desde la perspectiva de la estructura de la tabla, MySQL establece automáticamente el atributo NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP para el primer campo de marca de tiempo, y el siguiente campo de marca de tiempo, si no se especifica, se establece ** NOT NULL DEFAULT '0000-00-00 00 : 00: 00 '** propiedad. Si inserta un valor nulo en la columna de marca de tiempo, el sistema establecerá automáticamente el valor de esta columna en el valor de marca de tiempo actual. Es decir, cuando explicit_defaults_for_timestamp = OFF, se puede insertar un valor NULL incluso si la columna de marca de tiempo se establece en NOT NULL, y el sistema establecerá automáticamente el valor NULL en la marca de tiempo actual.

Cuando este parámetro se establece en ON, su comportamiento es el siguiente:

  • Si la columna de marca de tiempo no especifica explícitamente el atributo no nulo, entonces la columna predeterminada puede ser nula. En este momento, cuando se inserta un valor nulo en la columna, se registrará nulo directamente en lugar de la marca de tiempo actual.

  • No agregará automáticamente los atributos DEFAULT CURRENT_TIMESTAMP y ON UPDATE CURRENT_TIMESTAMP a la primera columna de marca de tiempo de la tabla.

  • Si se agrega la columna de marca de tiempo, el atributo no nulo y no se especifica ningún valor predeterminado. En este momento, si inserta un registro en la tabla, pero no se especifica ningún valor para la columna TIMESTAMP, si se especifica estricto sql_mode, se informará un error directamente. Si no se especifica sql_mode estricto, se insertará '0000-00-00 00:00:00' en la columna y se generará una advertencia.

mysql> muestra variables como 'explicit_defaults_for_timestamp'; 
+ --------------------------------- + ------- + 
| Variable_name | Valor | 
+ --------------------------------- + ------- + 
| explícita_defaults_for_timestamp | ON | 
+ --------------------------------- + ------- + 
mysql> crear tabla t2  
    -> ( 
    -> marca de tiempo ts1, 
    -> marca de tiempo ts2, 
    -> marca de tiempo ts3 predeterminada '2010-01-01 00:00:00' 
    ->); 
Consulta OK, 0 filas afectadas (0.02 seg) 
 
mysql> show create table t2 \ G 
************************* 1. fila ** ************************* 
       Tabla: t2 
Crear tabla: CREAR TABLA `t2` (
  `ts1` timestamp NULL DEFAULT NULL, 
  ` ts2` timestamp NULL DEFAULT NULL, 
  `ts3` timestamp NULL DEFAULT '2010-01-01 00:00:00' 
) ENGINE = InnoDB DEFAULT CHARSET = utf8 
1 fila en el conjunto (0.01 seg) 
 
mysql> insertar en valores t2 (nulo, nulo, nulo); 
Consulta OK, 1 fila afectada (0.01 seg) 
 
mysql> seleccione * de t2; 
+ ------ + ------ + ------ + 
| ts1 | ts2 | ts3 | 
+ ------ + ------ + ------ + 
| NULL | NULL | NULL | 
+ ------ + ------ + ------ + 
1 fila en el conjunto (0.00 seg) 
 
- 指定 NOT NULL 
mysql> crear tabla t3  
    -> ( 
    -> ts1 timestamp, 
    -> marca de tiempo ts2, 
    -> marca de tiempo ts3 no nula 
    ->);
Consulta OK, 0 filas afectadas (0.01 seg) 
 
mysql> show create table t3 \ G 
************************* 1. fila ** ************************* 
       Tabla: t3 
Crear tabla: CREATE TABLE `t3` ( 
  ` ts1` marca de tiempo NULL DEFAULT NULL, 
  `ts2` marca de tiempo NULL DEFAULT NULL, 
  marca de tiempo `ts3` NOT NULL 
) ENGINE = InnoDB DEFAULT CHARSET = utf8 
1 fila en conjunto (0.01 seg) 
 
mysql> insertar en valores t3 (nulo, nulo, nulo); 
ERROR 1048 (23000): La columna 'ts3' no puede ser nula 
 
mysql> insertar en los valores t3 (ts1, ts2) (nulo, nulo); 
Consulta OK, 1 fila afectada, 1 advertencia (0.01 seg) 
 
mysql> mostrar advertencias; 
+ --------- + ------ + -------------------------------- ---------- +
| Nivel | Código | Mensaje | 
+ --------- + ------ + -------------------------------- ---------- + 
| Advertencia | 1364 | El campo 'ts3' no tiene un valor predeterminado | 
+ --------- + ------ + -------------------------------- ---------- + 
 
mysql> seleccionar * de t3; 
+ ------ + ------ + --------------------- + 
| ts1 | ts2 | ts3 | 
+ ------ + ------ + --------------------- + 
| NULL | NULL | 0000-00-00 00:00:00 | 
+ ------ + ------ + --------------------- +

Se puede ver en la estructura de la tabla que cuando el parámetro está activado, MySQL agregará un atributo nulo predeterminado nulo a la columna de marca de tiempo de forma predeterminada, y MySQL no ha establecido la columna en el valor de marca de tiempo actual para el primer campo de marca de tiempo. El campo de marca de tiempo escribe un valor nulo y el valor nulo se almacena después de escribir, no la hora actual. Cuando el campo de marca de tiempo especifica NOT NULL, si inserta explícitamente NULL, se informará un mensaje de error: el campo no puede estar vacío; si no inserta explícitamente el campo y SQL_MODE no contiene 'NO_ZERO_DATE', insertará '0000-00-' en la columna 00 00:00:00 'y generar una advertencia.

CREATE TABLE `table_name` ( 
  ` increment_id` INT UNSIGNED NOT NULL auto_increment COMMENT '自 增 主 键', 
  ... 
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建 时间', 
  ` update_time` timestamp NOT NULL UP DEFAULT CESTRENT_TIMESTAMP '修改 时间', 
  LLAVE PRIMARIA (`increment_id`) 
) MOTOR = InnoDB DEFAULT CHARSET = utf8;

En este momento, el campo de marca de tiempo especificará NOT NULL. En este momento, se recomienda que el parámetro explicit_defaults_for_timestamp utilice el valor predeterminado OFF, de modo que no se informe ningún error cuando el campo de marca de tiempo se inserte explícitamente con un valor NULL, especialmente cuando el sql del programa no está escrito correctamente, lo que puede evitar errores de inserción del programa.

Supongo que te gusta

Origin blog.51cto.com/13598811/2591092
Recomendado
Clasificación