A partir del error de actualización de ejecución de MySQL ERROR 1292

157202a8d942e29df0356f05d93f000a.gif

Autor |

Fuente|Cuenta pública JiekeXu DBA Road (ID: JiekeXu_IT)

Si necesita reimprimir, comuníquese para obtener autorización | (ID personal de WeChat: JiekeXu_DBA)

Hola a todos, soy JiekeXu. Estoy muy contento de conocerlos nuevamente. Hoy, echaré un vistazo a la actualización de ejecución de MySQL e informaré el error ERROR 1292. Haga clic en la palabra azul "JiekeXu DBA Road" arriba para seguir mi cuenta oficial , coloque una estrella o un alfiler en la parte superior , ¡llegarán más productos secos lo antes posible!

La cosa es así, cuando usé la herramienta automatizada para ejecutar el SQL escrito por el desarrollador antes del trabajo el viernes pasado, la herramienta automatizada no se ejecutó, entonces fui manualmente al entorno de producción para ejecutarlo, y ocurrió un error "ERROR 1292 (22007): valor DOBLE incorrecto truncado " para truncar el valor DOBLE incorrecto . ¿Es porque la longitud del tipo de datos no es suficiente? A continuación, verifiquemos la estructura de la tabla.

mysql> update t_busi_cont set busi_contract_file='ba42cfdb-a1d0-4e5a-c'  and busi_contract_file_ct=1 
    -> where id='7823dcaade9145cdb8702d537';
ERROR 1292 (22007): Truncated incorrect DOUBLE value: 'ba42cfdb-a1d0-4e5a-c'




mysql> select busi_contract_file,busi_contract_file_ct from t_busi_cont where id='7823dcaade9145cdb8702d537';
+------------------------------------------------+-----------------------+
| busi_contract_file                             | busi_contract_file_ct |
+------------------------------------------------+-----------------------+
| undefined,ba42cfdb-a1d0-4e5a-c                 |                     2 |
+------------------------------------------------+-----------------------+

Mirando la estructura de la tabla, no hay nada de malo con estos dos tipos de campo, tipo de carácter y tipo entero, y varchar(4000). . . . . .

mysql> show create table t_busi_cont;
CREATE TABLE `t_busi_cont` (
  `sequence_no` int(18) NOT NULL AUTO_INCREMENT COMMENT '顺序号',
  `id` varchar(36) COLLATE utf8mb4_bin NOT NULL COMMENT '合同明细编号',
  `busi_contract_file` varchar(4000) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '合同文件编号,逗号分隔',
  `busi_contract_file_ct` int(10) NOT NULL DEFAULT '0' COMMENT '合同文件张数',
  ……省去其他字段……
  PRIMARY KEY (`sequence_no`),
  UNIQUE KEY `u_t_ar_busi_contract_01` (`id`),
  );

Luego use la herramienta de visualización del lado del cliente y la línea de comando Xshell para ejecutar el mismo error. No hay otra manera. Actualicemos por separado de acuerdo con la lógica SQL. La actualización por separado de acuerdo con las condiciones se considera un éxito. No lo he hecho. pensé que era un problema de gramática hasta aquí. . . . . .

mysql> update t_busi_cont set busi_contract_file='ba42cfdb-a1d0-4e5a-c' where id='7823dcaade9145cdb8702d537';
Query OK, 1 row affected (25.12 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> commit;
Query OK, 0 rows affected (0.01 sec)
mysql> update t_busi_cont set busi_contract_file_ct=1  where id='7823dcaade9145cdb8702d537';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> commit;
Query OK, 0 rows affected (0.01 sec)

En la etapa de verificación, no quería entenderlo por un tiempo, así que encontré un entorno de prueba y simulé la lógica de actualización.Como se muestra a continuación, la actualización fue exitosa. Pero a juzgar por los resultados de la actualización a continuación, solo actualizar el valor de id=1 a 0 no actualiza la columna c a 6, lo cual no es lo esperado. Si desea actualizar los valores de varias columnas, no puede usar AND, puede usar comas para separarlos. Aunque el error se debe a la sintaxis de la cláusula, la descripción del error de MySQL también me induce a pensar que hay un problema con el valor. Una de las razones para desencadenar este error es que la cláusula AND se usa al actualizar varias columnas de la tabla sin utilizar comas para separar varias columnas. .

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 48
Server version: 8.0.28 MySQL Community Server - GPL


Copyright (c) 2000, 2022, Oracle and/or its affiliates.


Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.


Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


mysql> select * from t;
+----+------+------+
| id | c    | d    |
+----+------+------+
|  1 |    1 |    1 |
|  2 |    2 |    2 |
|  3 |    3 |    3 |
|  4 |    4 |    4 |
|  5 |    5 |    4 |
+----+------+------+
5 rows in set (0.00 sec)


mysql> update t set id=6 and c=6 where d=1;    ----AND 连接
Query OK, 1 row affected (0.06 sec)
Rows matched: 1  Changed: 1  Warnings: 0


mysql> select * from t;
+----+------+------+
| id | c    | d    |
+----+------+------+
|  0 |    1 |    1 |
|  2 |    2 |    2 |
|  3 |    3 |    3 |
|  4 |    4 |    4 |
|  5 |    5 |    4 |
+----+------+------+
5 rows in set (0.00 sec)


mysql> update t set id=6,c=6 where d=1;  ----使用逗号分隔
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0


mysql> select * from t;
+----+------+------+
| id | c    | d    |
+----+------+------+
|  2 |    2 |    2 |
|  3 |    3 |    3 |
|  4 |    4 |    4 |
|  5 |    5 |    4 |
|  6 |    6 |    1 |
+----+------+------+
5 rows in set (0.00 sec)

58c1e50786bf5494399bb1c5ec0f52e0.png

En la prueba que se muestra arriba, "update t set id=6 and c=6 where d=1;" en realidad tuvo éxito, pero hay un problema, no sabe si lo ha pensado, ¿por qué se actualiza el valor a 0? Puedes pensarlo primero. Si no puedes pensar en eso por el momento, puedes continuar mirando la imagen a continuación.

de32a41699d53f23e944fe1d4bf1f12e.png

¿Ves claro? En la figura anterior, se ejecutan "update t set id='6' and c='6' where d=1;" y "update t set id='6' and c='1' where d=1;" con éxito, pero el valor de la actualización exitosa es diferente, el anverso es 1 y el reverso es 0, ¿lo piensas ahora? 0, 1, 0, 1 ¿No es un valor booleano? En MySQL, el optimizador trata la cláusula entre "set id=" y where como un valor, y el resultado de '6' y c='6' es It se considera verdadero, por lo que se actualiza a id=1, el resultado de '6' y c='1' se considera falso, por lo que se actualiza a id=0 (pero aún no entiendo por qué es este resultado, si alguien lo ve, puede darme una lección), pero en el entorno de producción, el tipo de datos incorrecto en la imagen a continuación no coincide y se informa un error, pero este mensaje de error es un poco confuso.

2e950d26bcdd049ca424556306789b94.png

En mi entorno de prueba Oracle 23c, simulé la operación anterior, y cuando ejecuté este SQL directamente, se informó un error y la operación no era válida ORA-00920.

Connected to:
Oracle Database 23c Free, Release 23.0.0.0.0 - Developer-Release
Version 23.2.0.0.0


SQL> CREATE TABLE JiekeXu.t1 (
  2    id int NOT NULL,
  3    c int DEFAULT NULL,
  4    d int DEFAULT NULL,
  5    PRIMARY KEY (id)
  6  );


Table created.


SQL> insert into JiekeXu.t1 values(1,1,1),(2,2,2),(3,3,3);    ----23c 新特性允许一次性插入多行值


3 rows created.


SQL> commit;


Commit complete.


SQL> select * from JiekeXu.t1;


        ID          C          D
---------- ---------- ----------
         1          1          1
         2          2          2
         3          3          3


SQL> update JiekeXu.t1 set id=6 and c=6 where d=1;
update JiekeXu.t1 set id=6 and c=6 where d=1
                           *
ERROR at line 1:
ORA-00920: invalid relational operator




SQL> update JiekeXu.t1 set id=6,c=6 where d=1;
1 row updated.

bf213a62032a4c99fa806b29d15574e5.png

A continuación, también probé que la versión de PostgreSQL 14 también informará un error directamente, y el mensaje de error es muy obvio ERROR: el argumento de AND debe ser de tipo booleano, no de tipo entero , Y debe ir seguido de un tipo booleano en lugar de un entero tipo.

73955c42b9ff7ce69ff46a4570cdc2de.png

$ psql
psql (14.1)
Type "help" for help.
postgres=# \c jiekexu
You are now connected to database "jiekexu" as user "postgres".
jiekexu=# \dt 
             List of relations
 Schema |     Name      | Type  |  Owner   
--------+---------------+-------+----------
 public | t             | table | postgres
 public | t1            | table | postgres
 public | t_analyzeplan | table | postgres
(3 rows)


jiekexu=# CREATE TABLE test (
jiekexu(#       id int NOT NULL,
jiekexu(#       c int DEFAULT NULL,
jiekexu(#       d int DEFAULT NULL,
jiekexu(#       PRIMARY KEY (id)
jiekexu(#     );
CREATE TABLE
jiekexu=# insert into test values(1,1,1),(2,2,2),(3,3,3);
INSERT 0 3
jiekexu=# 
jiekexu=# select * from test;
 id | c | d 
----+---+---
  1 | 1 | 1
  2 | 2 | 2
  3 | 3 | 3
(3 rows)


jiekexu=#  update test set id=6 and c=6 where d=1;
ERROR:  argument of AND must be type boolean, not type integer
LINE 1: update test set id=6 and c=6 where d=1;
                           ^
jiekexu=# show server_version;
 server_version 
----------------
 14.1
(1 row)

40a293685a83834f0aa563164e718773.png

El texto completo está terminado, espero que pueda ayudarlo a usted que está leyendo, si cree que este artículo es útil para usted, puede compartirlo con sus amigos, colegas, quien quiera, y compartirlo con quien quiera. aprendamos juntos y progresemos~~~

¡Bienvenido a seguir mi cuenta oficial [JiekeXu DBA Road] y aprender nuevos conocimientos juntos lo antes posible! Puede encontrarme en las siguientes tres direcciones. Las otras direcciones pertenecen a infracciones de derechos de autor pirateadas que rastrean mis artículos, y el formato del código, las imágenes, etc. están desordenados, lo cual es un inconveniente para leer. Bienvenido a mi cuenta oficial o dirección de Motianlun para seguir mí, y obtener las últimas actualizaciones tan pronto como sea posible la información.

————————————————————————————————
Cuenta pública: JiekeXu DBA Road
CSDN: https://blog.csdn.net/
Rueda JiekeXu Motian: https://www.modb.pro/u/4347
————————————————————————————————

1212dbcc0b5d69618025af28c9833b74.gif

Comparta varios scripts de copia de seguridad de la base de datos

Comprobación de fragmentación de tablas de Oracle y esquema de desfragmentación

OGG|Oracle GoldenGate 基础2022 年公众号历史文章合集整理
 
  

Varios problemas encontrados por Oracle 19c RAC

OGG|Oracle 数据迁移后比对一致性

OGG|Arquitectura de microservicios Oracle GoldenGate

El uso del espacio de la tabla de consulta de Oracle es extremadamente lento

Base de datos doméstica|Primera experiencia de instalación rápida autónoma de TiDB 5.4

Proceso de mantenimiento de cierre de la base de datos en espera de Oracle ADG y recuperación incremental

Entorno Linux para construir el entorno de sincronización maestro-esclavo MySQL8.0.28

bb5d1f0f8c0856d6055aeade49b23366.png

Supongo que te gusta

Origin blog.csdn.net/JiekeXu/article/details/131651113
Recomendado
Clasificación