MySQL Insert Onde consulta

O que há de errado com esta consulta:

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

Funciona sem a cláusula WHERE . Eu pareci ter esquecido o meu SQL ..

A syntax de INSERT do MySQL não suporta a cláusula WHERE, portanto, sua consulta, como está, falhará. Supondo que sua coluna de id seja exclusiva ou chave primária:

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

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

Se você estiver tentando alterar os valores de peso / valores desejados para uma linha existente com ID 1, deverá usar:

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

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

 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 a sua coluna de id for uma coluna de incremento automático, você também pode omiti-la do seu INSERT e deixar o mysql incrementá-la normalmente.

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

  1. INSERIR 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 

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

No MySQL, se você quiser INSERT ou UPDATE, você pode usar a consulta REPLACE com uma cláusula WHERE. Se o WHERE não existe, INSERVE, caso contrário atualiza.

EDITAR

Eu acho que o ponto de vista de Bill Karwin é importante o suficiente para sair dos comentários e torná-lo muito óbvio. Obrigado Bill, já faz muito tempo desde que trabalhei com o MySQL, lembrei que tive problemas com o REPLACE, mas esqueci o que eles eram. Eu deveria ter procurado.

Não é assim que o REPLACE do MySQL funciona. Ele faz um DELETE (que pode ser um no-op se a linha não existir), seguido por um INSERT. Pense nas conseqüências vis. gatilhos e dependencies de foreign keys. Em vez disso, use INSERT … ON DUPLICATE KEY UPDATE.

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

A resposta certa para esta questão 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ê quiser CLONE um registro da tabela SAME, lembre-se você não pode selecionar a partir da tabela para a qual você está inserindo, portanto,

  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 esta bonita cobre a maioria dos cenários

A consulta de inserção não suporta 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'; 

Colocando um “select” na instrução insert, você pode executar múltiplos inserts rapidamente.

Com este tipo de inserção, você pode querer 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 que você não insira 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, você 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ê quisesse inserir um único registro, você poderia 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 que você insira seus valores em uma instrução select, mesmo que os valores não estejam atualmente armazenados em uma tabela.

Veja também Como inserir com cláusula where

Inserir em = Adicionando linhas a uma tabela

Atualizar = atualizar linhas específicas.

O que a cláusula where descreve na sua inserção? Não tem nada para combinar, a linha não existe (ainda) …

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 só funciona em instruções SELECT:

 SELECT from Users WHERE id = 1; 

ou em instruções UPDATE:

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

LEIA ISTO BEM

Não faz sentido … nem mesmo literalmente

INSERT significa adicionar uma new row e quando você diz WHERE você define em qual linha você está falando no SQL .

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

Você tem que escolher o seguinte:

A. Use UPDATE vez de INSERT

B. Use INSERT e remova a cláusula WHERE (estou apenas dizendo isso …) ou se você estiver realmente obrigado a usar INSERT e WHERE em uma única instrução, isso pode ser feito somente via 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 id como Primary Key, esta inserção será falha, caso contrário, uma nova linha será inserida com id = 1.

Depende da situação O INSERT pode 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 é?

A maneira mais simples é usar o IF para violar sua restrição de chave. Isso só funciona para INSERIR IGNORE, mas permitirá que você use a restrição em um INSERT.

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

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

Então, a questão é, existe alguma linha cujo id é 1? Se assim for, use o MySQL UPDATE , ou use o MySQL INSERT .

Se você estiver especificando um registro específico para inserir dados, é melhor usar a UPDATE vez da instrução INSERT .

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, então é melhor usar a UPDATE para atualizar o registro existente. Não é recomendado usar a cláusula WHERE 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; 

A WHERE-clause pode ser realmente usada com INSERT-INTO-VALUES em qualquer caso?

A resposta é definitivamente não.

Adicionar uma cláusula WHERE após INSERT INTO … VALUES … é apenas um 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.

seu totall errado. INSERT QUERY não possui uma cláusula WHERE, somente UPDATE QUERY a possui. Se você quiser adicionar dados, onde id = 1, então sua consulta será

 UPDATE Users SET weight=160, desiredWeight= 145 WHERE id = 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 eu não tenho certeza do porque você precisa disso de qualquer maneira.

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

Na verdade, eu posso saber por que você precisa de uma cláusula where no comando Insert ??

Talvez com base na razão que eu possa sugerir-lhe uma opção melhor.

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

REPLACE INTO Usuários (id, weight, desiredWeight) VALUES (1, 160, 145);

Você pode fazer INSERT condicional com base na input do usuário. Esta consulta só será inserida se as inputs vars ‘$ 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'!=''; 

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

fundo:

Eu tinha um muitos para 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 determinado usuário assim como eu faria usando uma cláusula WHERE.

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

Ao usar essa construção, você realmente tem como alvo 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 poderia ser:

 aUser aCar user123 mini user123 HisOtherCarThatWasThereBefore 

A syntax correta para a inserção do mysql na instrução usando o método post é:

 $sql="insert into ttable(username,password) values('$_POST[username]','$_POST[password]')"; 

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

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

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

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