Autor | JiekeXu
Fonte|Conta pública JiekeXu DBA Road (ID: JiekeXu_IT)
Se precisar reimprimir, entre em contato para obter autorização | (ID pessoal do WeChat: JiekeXu_DBA)
Olá a todos, sou JiekeXu. Estou muito feliz em conhecê-los novamente. Hoje, darei uma olhada na atualização de execução do MySQL e relatarei o erro ERROR 1292. Por favor, clique na palavra azul "JiekeXu DBA Road" acima para seguir minha conta oficial , estrela ou alfinete no topo, mais produtos secos chegarão o mais rápido possível!
A coisa é assim, quando usei a ferramenta automatizada para executar o SQL escrito pelo desenvolvedor antes do trabalho na última sexta-feira, a ferramenta automatizada falhou ao executar, então fui manualmente para o ambiente de produção para executá-la e ocorreu um erro "ERRO 1292 (22007): Truncated incorrect DOUBLE value" para truncar o valor DOUBLE incorreto . É porque o comprimento do tipo de dados não é suficiente? Em seguida, vamos verificar a estrutura da tabela.
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 |
+------------------------------------------------+-----------------------+
Observando a estrutura da tabela, não há nada de errado com esses dois tipos de campo, tipo de caractere e tipo inteiro, e 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`),
);
Em seguida, use a ferramenta de visualização do lado do cliente e a linha de comando do Xshell para executar o mesmo erro. Não há outro jeito. Vamos atualizar separadamente de acordo com a lógica SQL. A atualização separada de acordo com as condições é considerada um sucesso. Não fiz pensei que é um problema de gramática até aqui. . . . . .
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)
Na etapa de verificação, não queria entender por um tempo, então encontrei um ambiente de teste e simulei a lógica de atualização. Conforme mostrado abaixo, a atualização foi bem-sucedida. Mas, a julgar pelos resultados da atualização abaixo, apenas atualizar o valor de id=1 para 0 não atualiza a coluna c para 6, o que não é o esperado. Se você deseja atualizar os valores de várias colunas, não pode usar AND, pode usar vírgulas para separá-las. Embora o erro seja devido à sintaxe da cláusula, a descrição do erro do MySQL também me leva a pensar que há um problema com o valor. Uma das razões para acionar esse erro é que a cláusula AND é usada ao atualizar várias colunas de a tabela sem usar vírgulas para separar várias colunas. .
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)
No teste mostrado acima, "update t set id=6 e c=6 where d=1;" realmente deu certo, mas há um problema, você não sabe se já pensou nisso, por que o valor é atualizado para 0? Você pode pensar sobre isso primeiro. Se você não consegue pensar nisso por enquanto, pode continuar a olhar para a imagem abaixo.
Você vê claramente? Na figura acima, "update t set id='6' and c='6' where d=1;" e "update t set id='6' and c='1' where d=1;" são executados com sucesso, mas o valor da atualização com sucesso é diferente, a frente é 1 e a parte de trás é 0, você pensa nisso agora? 0, 1, 0, 1 Isso não é um valor booleano? No MySQL, o otimizador trata a cláusula entre "set id=" e where como um valor, e o resultado de '6' e c='6' é It é considerado verdadeiro, então é atualizado para id=1, o resultado de '6' e c='1' é considerado falso, então é atualizado para id=0 (mas ainda não entendo porque é esse resultado, se alguém ver, pode me dar uma lição), mas no ambiente de produção, o tipo de dados errado na imagem abaixo não corresponde e um erro é relatado, mas essa mensagem de erro é um pouco confusa.
Em meu ambiente de teste Oracle 23c, simulei a operação acima, e ao executar este SQL diretamente, foi reportado um erro, sendo a operação invá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.
Em seguida, também testei que a versão do PostgreSQL 14 também relatará um erro diretamente, e a mensagem de erro é muito óbvia ERROR:argument of AND deve ser do tipo boolean, não do tipo integer , AND deve ser seguido por um tipo boolean em vez de um integer tipo.
$ 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)
O texto completo está pronto, espero que possa ajudar você que está lendo, se você acha que este artigo é útil para você, pode compartilhar com seus amigos, colegas, quem você gosta, e compartilhar com quem você gosta, vamos aprender juntos e progredir~~~
Bem-vindo a seguir minha conta oficial [JiekeXu DBA Road] e aprender novos conhecimentos juntos o mais rápido possível! Você pode me encontrar nos três endereços a seguir. Os outros endereços pertencem à violação de direitos autorais pirata que rastreia meus artigos, e o formato do código, as imagens etc. são desordenados, o que é inconveniente de ler. Bem-vindo à minha conta oficial ou endereço Motianlun a seguir mim, e obtenha as últimas atualizações o mais rápido possível.
————————————————————————————————
Conta pública: JiekeXu DBA Road
CSDN: https://blog.csdn.net/
Roda JiekeXu Motian: https://www.modb.pro/u/4347
———————————————————————————————
Compartilhe vários scripts de backup de banco de dados
Verificação de fragmentação de tabela Oracle e esquema de desfragmentação
OGG|Oracle GoldenGate 基础2022 年公众号历史文章合集整理
Vários problemas encontrados pelo Oracle 19c RAC
OGG|Oracle 数据迁移后比对一致性
Arquitetura de Microsserviços OGG|Oracle GoldenGate
O uso do espaço de tabela de consulta do Oracle é extremamente lento
Banco de dados doméstico | Primeira experiência de instalação rápida autônoma do TiDB 5.4
Processo de manutenção de desligamento do banco de dados em espera do Oracle ADG e recuperação incremental
Ambiente Linux para construir ambiente de sincronização mestre-escravo MySQL8.0.28