Página 1 de 1

problema com delete e where

Enviado: 04 Out 2021 09:31
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.

problema com delete e where

Enviado: 04 Out 2021 10:43
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) + "'"

problema com delete e where

Enviado: 04 Out 2021 11:09
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 ?

problema com delete e where

Enviado: 04 Out 2021 11:22
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'

problema com delete e where

Enviado: 04 Out 2021 12:05
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.

problema com delete e where

Enviado: 04 Out 2021 12:08
por mmarcondes
agora deu certo e entendi o pq, tem que ter aspas simples antes e depois.
obrigado alxsts !!

problema com delete e where

Enviado: 04 Out 2021 12:17
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 !

problema com delete e where

Enviado: 04 Out 2021 12:56
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

problema com delete e where

Enviado: 04 Out 2021 14:25
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.

problema com delete e where

Enviado: 06 Out 2021 09:08
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.