MySQL Insert Where query

121

O que há de errado com esta consulta:

INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;

Funciona sem a WHEREcláusula. Eu parecia ter esquecido meu SQL ..

Taryn
fonte

Respostas:

237

A sintaxe INSERT do MySQL não suporta a cláusula WHERE, portanto sua consulta falhará. Supondo que sua idcoluna seja chave exclusiva ou primária:

Se você está tentando inserir uma nova linha com o ID 1, deve estar usando:

INSERT INTO Users(id, weight, desiredWeight) VALUES(1, 160, 145);

Se você estiver tentando alterar os valores de peso / peso desejado para uma linha existente com o ID 1, use:

UPDATE Users SET weight = 160, desiredWeight = 145 WHERE id = 1;

Se você quiser, também pode usar a sintaxe INSERT .. ON DUPLICATE KEY da seguinte maneira:

INSERT INTO Users (id, weight, desiredWeight) VALUES(1, 160, 145) ON DUPLICATE KEY UPDATE weight=160, desiredWeight=145

OU mesmo assim:

INSERT INTO Users SET id=1, weight=160, desiredWeight=145 ON DUPLICATE KEY UPDATE weight=160, desiredWeight=145

Também é importante notar que, se sua idcoluna é uma coluna de autoincremento, você também pode omitir tudo do seu INSERT e deixar o mysql incrementá-lo normalmente.

Chad Birch
fonte
1
Obrigado por uma boa resposta. Ao usar a consulta UPDATE, está funcionando bem. Mas, quando id é uma chave primária e uma chave de incremento automático, a instrução INSERT acima não funciona. Erro: Entrada duplicada '1' para a chave 1.
JDGuide
1
@ JDeveloper Isso ocorre porque a linha já existe. Como Chad mencionou, If you're trying to insert a new row with ID 1 you should be usinginsira. No seu caso, você está tentando inserir quando ID 1 já existe e é uma chave primária ou única e falha assim que você deve ou sintaxe uso UPDATE ou sintaxe INSERIR .. ON DUPLICATE KEY
Anthony Hatzopoulos
41

Você não pode combinar uma cláusula WHERE com uma cláusula VALUES. Você tem duas opções, tanto quanto eu sei.

  1. INSERT especificando valores

    INSERT INTO Users(weight, desiredWeight) 
    VALUES (160,145)
  2. INSERT usando uma instrução SELECT

    INSERT INTO Users(weight, desiredWeight) 
    SELECT weight, desiredWeight 
    FROM AnotherTable 
    WHERE id = 1
Russ Cam
fonte
19

Você usa a cláusula WHERE para consultas UPDATE. Quando você insere, está assumindo que a linha não existe.

A declaração do OP seria então;

UPDATE Users SET peso = 160, desejávelPeso = 45 onde id = 1;

No MySQL, se você deseja INSERT ou UPDATE, pode usar a consulta REPLACE com uma cláusula WHERE. Se o WHERE não existir, INSERIR, caso contrário, ATUALIZA.

EDITAR

Penso que o argumento de Bill Karwin é importante o suficiente para retirar os comentários e torná-lo muito óbvio. Obrigado Bill, já faz muito tempo que não trabalho com o MySQL, lembrei-me de ter problemas com o REPLACE, mas esqueci o que eram. Eu deveria ter procurado.

Não é assim que o REPLACE do MySQL funciona. Ele executa um DELETE (que pode ser um no-op se a linha não existir), seguido por um INSERT. Pense nas consequências vis. gatilhos e dependências de chave estrangeira. Em vez disso, use INSERT ... ON DUPLICATE KEY UPDATE.

Rob Prouse
fonte
7
Não é assim que o REPLACE do MySQL funciona. Ele executa um DELETE (que pode ser um no-op se a linha não existir), seguido por um INSERT. Pense nas consequências vis. gatilhos e dependências de chave estrangeira. Em vez disso, use INSERT ... ON DUPLICATE KEY UPDATE.
27909 Bill Karwin
10

Não acredito que a inserção tenha uma cláusula WHERE.

Daniel A. White
fonte
Isso é verdade e areia ao mesmo tempo!
Ingus
5

A consulta de inserção não suporta onde a palavra-chave *

As condições se aplicam porque você pode usar a condição where para instruções de sub-seleção. Você pode executar inserções complicadas usando sub-seleções.

Por exemplo:

INSERT INTO suppliers
(supplier_id, supplier_name)
SELECT account_no, name
FROM customers
WHERE city = 'Newark';

Ao colocar um "select" na instrução de inserção, você pode executar várias inserções rapidamente.

Com esse tipo de inserção, convém verificar o número de linhas sendo inseridas. Você pode determinar o número de linhas que serão inseridas executando a seguinte instrução SQL antes de executar a inserção.

SELECT count(*)
FROM customers
WHERE city = 'Newark';

Você pode certificar-se de não inserir informações duplicadas usando a condição EXISTS.

Por exemplo, se você tivesse uma tabela chamada clients com uma chave primária de client_id, poderia usar a seguinte instrução:

INSERT INTO clients
(client_id, client_name, client_type)
SELECT supplier_id, supplier_name, 'advertising'
FROM suppliers
WHERE not exists (select * from clients
where clients.client_id = suppliers.supplier_id);

Esta instrução insere vários registros com uma subseleção.

Se você deseja inserir um único registro, pode usar a seguinte instrução:

INSERT INTO clients
(client_id, client_name, client_type)
SELECT 10345, 'IBM', 'advertising'
FROM dual
WHERE not exists (select * from clients
where clients.client_id = 10345);

O uso da tabela dupla permite inserir seus valores em uma instrução select, mesmo que os valores não estejam armazenados atualmente em uma tabela.

Consulte também Como inserir com a cláusula where

Somnath Muluk
fonte
4

A resposta certa para esta pergunta será assim:

uma). SE quiser selecionar antes de inserir:

INSERT INTO Users( weight, desiredWeight ) 
  select val1 , val2  from tableXShoulatNotBeUsers
  WHERE somecondition;

b) Se o registro já existir, use update em vez de insert:

 INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;

Deveria estar

Update Users set weight=160, desiredWeight=145  WHERE id = 1;

c) Se você deseja atualizar ou inserir ao mesmo tempo

Replace Users set weight=160, desiredWeight=145  WHERE id = 1;

Note):- you should provide values to all fields else missed field in query 
        will be set to null

d) Se você deseja CLONAR um registro da mesma tabela, lembre-se de que não pode selecionar a tabela na qual está inserindo.

 create temporary table xtable ( weight int(11), desiredWeight int(11) ;

 insert into xtable (weight, desiredWeight) 
    select weight, desiredWeight from Users where [condition]

 insert into Users (weight, desiredWeight) 
    select weight , desiredWeight from xtable;

Eu acho que isso cobre a maioria dos cenários

sakhunzai
fonte
3

Você simplesmente não pode usar WHERE ao fazer uma instrução INSERT:

 INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;

deveria estar:

 INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 );

A parte WHERE funciona apenas nas instruções SELECT:

SELECT from Users WHERE id = 1;

ou nas instruções UPDATE:

UPDATE Users set (weight = 160, desiredWeight = 145) WHERE id = 1;
Borniet
fonte
2

Inserir em = Adicionando linhas a uma tabela

Upate = atualizar linhas específicas.

O que a cláusula where descreveria em sua inserção? Não tem nada para combinar, a linha ainda não existe ...

Richard L
fonte
2

Você pode fazer INSERT condicional com base na entrada do usuário. Esta consulta será inserida apenas se os vars de entrada '$ userWeight' e '$ userDesiredWeight' não estiverem em branco

INSERT INTO Users(weight, desiredWeight )
select '$userWeight', '$userDesiredWeight'  
FROM (select 1 a ) dummy
WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';
Igor Vujovic
fonte
1

Depende da situação em que o INSERT pode realmente ter uma cláusula where.

Por exemplo, se você estiver combinando valores de um formulário.

Consider INSERT INTO Users(name,email,weight, desiredWeight) VALUES (fred,bb@yy.com,160,145) WHERE name != fred AND email != bb@yy.com

Faz sentido, não é?

Frank Nwoko
fonte
é possível cláusula where na instrução insert
Taja_100 29/03
1

A maneira mais simples é usar o IF para violar sua principal restrição. Isso funciona apenas para INSERT IGNORE, mas permitirá que você use restrições em um INSERT.

INSERT INTO Test (id, name) VALUES (IF(1!=0,NULL,1),'Test');
Ethan Brooks
fonte
1

Depois de WHERE cláusula, você coloca uma condição e é usada para buscar dados ou atualizar uma linha. Quando você está inserindo dados, assume-se que a linha não existe.

Então, a questão é: existe alguma linha cujo ID seja 1? Nesse caso, use MySQL UPDATE , caso contrário, use MySQL INSERT .

Revathi
fonte
1

Se você estiver especificando um registro específico no para inserir dados, é melhor usar a UPDATEinstrução em vez da INSERTinstrução.

Esse tipo de consulta que você escreveu na pergunta é como uma consulta fictícia.

Sua consulta é: -

INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;

Aqui, você está especificando o id = 1, para usar melhor a UPDATEinstrução para atualizar o registro existente. Não é recomendável usar a WHEREcláusula no caso de INSERT.Você deve usar UPDATE.

Agora usando a consulta de atualização: -

UPDATE Users SET weight=160,desiredWeight=145 WHERE id=1;
JDGuide
fonte
Nenhuma consulta mate.1st não funcionará. A primeira pergunta é a pergunta feita.
JDGuide 7/08/12
Por que você está sugerindo atualização sobre inserção? O usuário deseja inserir valores com condição e não atualizar os registros existentes.
Somnath Muluk
1

A cláusula WHERE pode realmente ser usada com INSERT-INTO-VALUES em qualquer caso?

A resposta é definitivamente não.

Adicionar uma cláusula WHERE após INSERT INTO ... VALUES ... é apenas SQL inválido e não será analisado.

O erro retornado pelo MySQL é:

mysql> INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE id = 1' at line 1

A parte mais importante da mensagem de erro é

... syntax to use near 'WHERE id = 1' ...

que mostra a parte específica que o analisador não esperava encontrar aqui: a cláusula WHERE.

Marc Alff
fonte
1

está totalmente errado. INSERT QUERY não possui uma cláusula WHERE, apenas UPDATE QUERY possui. Se você deseja adicionar dados Onde id = 1, sua consulta será

UPDATE Users SET weight=160, desiredWeight= 145 WHERE id = 1;
Asmarah
fonte
1

Não. Tanto quanto sei, você não pode adicionar a cláusula WHERE a esta consulta. Talvez eu tenha esquecido meu SQL também, porque não sei ao certo por que você precisa dele.

Ikechi Anyanwu
fonte
1

Você não deve usar a condição where na instrução Insert. Se você deseja fazer, use insert em uma instrução de atualização e atualize um registro existente.

Na verdade, posso saber por que você precisa de uma cláusula where na instrução Insert?

Talvez com base no motivo, eu sugiro uma opção melhor.

Krishna Thota
fonte
1

Eu acho que sua melhor opção é usar REPLACE em vez de INSERT

SUBSTITUIR PARA Usuários (ID, peso, peso desejado) VALORES (1, 160, 145);

Alberto León
fonte
1

LEIA ISTO TAMBÉM

Não faz sentido ... mesmo literalmente

INSERTsignifica adicionar ae new rowquando você diz WHEREque define em qual linha está falando no SQL.

Portanto, não é possível adicionar uma nova linha com uma condição em uma linha existente.

Você deve escolher entre as seguintes opções:

A. Use em UPDATEvez deINSERT

B. Use INSERTe remova a WHEREcláusula (estou apenas dizendo ...) ou se você é realmente obrigado a usar INSERTe, WHEREem uma única declaração, isso pode ser feito apenas através da cláusula INSERT..SELECT ...

INSERT INTO Users( weight, desiredWeight ) 
SELECT FROM Users WHERE id = 1;

Mas isso serve a um propósito totalmente diferente e, se você definiu o ID como Chave Primária, essa inserção falhará; caso contrário, uma nova linha será inserida com o ID = 1.

Bharat Sinha
fonte
sim, você está correto, sabendo que todas essas coisas acordam cometem erros.
Asesha George
1

Estou ciente de que este é um post antigo, mas espero que ainda ajude alguém, com o que espero que seja um exemplo simples:

fundo:

Eu tive muitos casos: o mesmo usuário é listado várias vezes com vários valores e eu queria criar um novo registro, portanto, UPDATE não faria sentido no meu caso e eu precisava abordar um usuário específico, como faria usando uma cláusula WHERE.

INSERT into MyTable(aUser,aCar)
value(User123,Mini)

Ao usar essa construção, você realmente direciona um usuário específico (user123, que possui outros registros), para que você realmente não precise de uma cláusula where, eu acho.

a saída pode ser:

aUser   aCar
user123 mini
user123 HisOtherCarThatWasThereBefore
Ylenia88m
fonte
1

Uma maneira de usar INSERT e ONDE é

INSERT INTO MYTABLE SELECT 953,'Hello',43 WHERE 0 in (SELECT count(*) FROM MYTABLE WHERE myID=953); Nesse caso, é como um teste de existência. Não há exceção se você executá-lo duas ou mais vezes ...

Roubar
fonte
0

A sintaxe correta para o mysql inserir na instrução usando o método post é:

$sql="insert into ttable(username,password) values('$_POST[username]','$_POST[password]')";
chaitanya koripella
fonte
1
Você precisa escapar de parâmetros não confiáveis, como o nome de usuário ou usar consultas parametrizadas para impedir que um invasor injete comandos SQL arbitrários . E use um dos algoritmos HashCrypt para armazenar a senha.
Hendrik Brummermann
0

Eu não acho que podemos usar a cláusula where na instrução insert

Nipun Jain
fonte
0
INSERT INTO Users(weight, desiredWeight )
SELECT '$userWeight', '$userDesiredWeight'  
FROM (select 1 a ) dummy
WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';
user6297694
fonte
1
Você pode editar sua resposta proposta para expandir o que isso faz e como ela aborda o OP?
Ro Yo Mi
0

Você não pode usar INSERT e WHERE juntos. Você pode usar a cláusula UPDATE para adicionar valor a uma coluna específica em um campo específico, como abaixo do código;

UPDATE Users
SET weight='160',desiredWeight ='145'  
WHERE id =1
Vishal Vaishnav
fonte
0

Eu acho que o formulário correto para inserir um valor em uma linha de especificação é:

UPDATE table SET column = value WHERE columnid = 1

funciona e é semelhante se você escrever no Microsoft SQL Server

INSERT INTO table(column) VALUES (130) WHERE id = 1;

no mysql você precisa atualizar a tabela.

Jonathan JS
fonte
0

Você pode fazer isso com o código abaixo:

INSERT INTO table2 (column1, column2, column3, ...)
SELECT column1, column2, column3, ...
FROM table1
WHERE condition
KimchiMan
fonte