problema com delete e where

Forum sobre SQL.

Moderador: Moderadores

mmarcondes
Usuário Nível 2
Usuário Nível 2
Mensagens: 81
Registrado em: 02 Jul 2021 15:06
Localização: witmarsum

problema com delete e where

Mensagem por mmarcondes »

bom dia amigos, final de semana iniciei meus estudos com mysql, consegui incluir, alterar, etc, mas quando fui deletar deu erro, passei o domingo olhando e não consegui entender a mensagem de erro.
na minha tabela itens, tem um campo onde eu mesclo letras e números ( referencia varchar(30) ), ele fica mais ou menos assim o conteúdo : gspx4857214104
fiz um teste tentando apagar um registro com base nele : delete from itens_pedidos where referencia = gspx4857214104, no fonte ficou assim :

pesquisa := AllTrim(v_ref)
cQuery_del := "delete from itens_pedidos where referencia = "+pesquisa
oQuery_del := oMySQL:query( cQuery_del )
if oQuery_del:neterr()
Alert(oQuery_del:error())
return( nil )
endif

o erro apresentado foi :

unknown column "gspx4857214104" in where clause

agradeço qualquer ajuda, obrigado.
Fernando queiroz
Usuário Nível 4
Usuário Nível 4
Mensagens: 779
Registrado em: 13 Nov 2014 00:41
Localização: Porto Alegre/RS

problema com delete e where

Mensagem por Fernando queiroz »

use a chave única da tabela para deletar , ficou meio estranho o seu delete

DELETE FROM regrastributarias WHERE Regra_id ='" + STRZERO(::nRegra_Id,11,0) + "'"
HARBOUR 3.2, HWGUI 2.23 B3, SEFAZCLASS, PDFClass, ADO + MariaDB/MySQL, RMChart
mmarcondes
Usuário Nível 2
Usuário Nível 2
Mensagens: 81
Registrado em: 02 Jul 2021 15:06
Localização: witmarsum

problema com delete e where

Mensagem por mmarcondes »

eu li sobre isso, mas fiquei curioso, pq passei anos usando dbf e tudo dava certo, pq o mysql não entende algo tão simples ?
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

problema com delete e where

Mensagem por alxsts »

Olá!

O conteúdo de campos não numéricos, incluido dates, tem que estar entre aspas simples:

Código: Selecionar todos

 delete from itens_pedidos where referencia = 'gspx4857214104'
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

problema com delete e where

Mensagem por JoséQuintas »

mmarcondes escreveu:eu li sobre isso, mas fiquei curioso, pq passei anos usando dbf e tudo dava certo, pq o mysql não entende algo tão simples ?
E quem disse que o DBF aceitaria isso?

Código: Selecionar todos

cCmd := "NOME=" + pesquisa
DELETE FOR &( cCmd )
Aliás.... o erro é exatamente o mesmo: o campo não existe.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
mmarcondes
Usuário Nível 2
Usuário Nível 2
Mensagens: 81
Registrado em: 02 Jul 2021 15:06
Localização: witmarsum

problema com delete e where

Mensagem por mmarcondes »

agora deu certo e entendi o pq, tem que ter aspas simples antes e depois.
obrigado alxsts !!
mmarcondes
Usuário Nível 2
Usuário Nível 2
Mensagens: 81
Registrado em: 02 Jul 2021 15:06
Localização: witmarsum

problema com delete e where

Mensagem por mmarcondes »

José, eu entendi a lógica do teu teste, realmente, se não tiver o campo não tem como, seja em qual linguagem ou banco de dados for, na minha humilde opinião isso é muito primário, e como eu havia dito, eu já tinha me certificado disso, passei o dia todo repetindo a rotina sem entender o erro, mas com a ajuda do amigo alxsts eu entendi algo que tinha lido ontem, que para o mysql tudo é texto, independente se for numero, data e string, e é aqui o problema de quem estava acostumado só com dbf, no mysql vc precisa colocar uma string dentro de aspas simples para que seja entendido como tal, senão o mysql vai entender que aquilo é outra coisa e vai dar erro mesmo !
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

problema com delete e where

Mensagem por alxsts »

Olá!
mmarcondes escreveu:para o mysql tudo é texto, independente se for numero, data e string,
Não, isto não é verdade. Veja:

Código: Selecionar todos

-- deletar um pedido identificado por um campo numérico (idPedido 5964)
DELETE FROM tbOrder WHERE idOrder = 5964  -- campo numérico não precisa de aspas

-- deletar os pedidos de uma data
DELETE FROM tbOrder WHERE dtOrder >= '2021-09-30' AND dtOrder <= '2021-09-30'    -- campo data precisa de aspas

-- deletar os itens de um pedido específico com itens com código alfanumérico
DELETE FROM tbOrder WHERE idOrder = 5964 AND idProd = '21RBS'  -- campo alfanumérico precisa de aspas

-- deletar os pedidos cancelados -> fgCancel é uma coluna do tipo boolean
DELETE FROM tbOrder WHERE fgCancel = TRUE  -- campo boolean não precisa de aspas
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

problema com delete e where

Mensagem por JoséQuintas »

mmarcondes escreveu:e é aqui o problema de quem estava acostumado só com dbf, no mysql vc precisa colocar uma string dentro de aspas simples para que seja entendido como tal, senão o mysql vai entender que aquilo é outra coisa e vai dar erro mesmo
Em DBF:

Código: Selecionar todos

DELETE FOR NOME = "JOSE"
Não é diferença de DBF e SQL.
Uma coisa é usar uma variável pré-definida no APLICATIVO, onde o aplicativo faz tudo.
Outra coisa é passar o comando para o servidor, que desconhece qualquer variável do aplicativo.

Se usar o mesmo conceito com DBF, vai remover muitas limitações que existem hoje no Clipper/Harbour.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

problema com delete e where

Mensagem por JoséQuintas »

JoséQuintas escreveu:Se usar o mesmo conceito com DBF, vai remover muitas limitações que existem hoje no Clipper/Harbour.
Só exemplo disso, que acaba tornando tudo igual.
O mais comum é usar no DBF:

Código: Selecionar todos

cNome := "JOSE"
SET FILTER TO NOME = cNome
SET FILTER TO NOME="&cNome"
Isso deixa o filtro preso a existir a variável

Código: Selecionar todos

cNome := "JOSE"
cFilter := [NOME = "] + cNome + ["]
SET FILTER TO &cFilter
Agora o filtro só contém texto fixo.
Nenhum erro por variável não existir depois.

Assim fica visível que DBF ou SQL, a indicação de string precisa das aspas.
Não depender de variáveis é obrigatório para comandos SQL, mas pode ajudar muito no DBF/aplicativo também.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder