Respostas:
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.
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
Você não pode combinar uma cláusula WHERE com uma cláusula VALUES. Você tem duas opções, tanto quanto eu sei.
INSERT especificando valores
INSERT INTO Users(weight, desiredWeight)
VALUES (160,145)INSERT usando uma instrução SELECT
INSERT INTO Users(weight, desiredWeight)
SELECT weight, desiredWeight
FROM AnotherTable
WHERE id = 1Você 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.
Não acredito que a inserção tenha uma cláusula WHERE.
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
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
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;
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'!='';
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 é?
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');
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 .
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;
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.
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.
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.
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);
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.
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
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]')";
Eu não acho que podemos usar a cláusula where 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 uma coluna específica em um campo específico, como abaixo do código;
UPDATE Users
SET weight='160',desiredWeight ='145'
WHERE id =1
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.