Réponses:
La syntaxe MySQL INSERT ne prend pas en charge la clause WHERE, donc votre requête en l'état échouera. En supposant que votre id
colonne est une clé unique ou primaire:
Si vous essayez d'insérer une nouvelle ligne avec l'ID 1, vous devriez utiliser:
INSERT INTO Users(id, weight, desiredWeight) VALUES(1, 160, 145);
Si vous essayez de modifier les valeurs de poids / poids souhaité pour une ligne existante avec l'ID 1, vous devez utiliser:
UPDATE Users SET weight = 160, desiredWeight = 145 WHERE id = 1;
Si vous le souhaitez, vous pouvez également utiliser la syntaxe INSERT .. ON DUPLICATE KEY comme suit:
INSERT INTO Users (id, weight, desiredWeight) VALUES(1, 160, 145) ON DUPLICATE KEY UPDATE weight=160, desiredWeight=145
OU même comme ça:
INSERT INTO Users SET id=1, weight=160, desiredWeight=145 ON DUPLICATE KEY UPDATE weight=160, desiredWeight=145
Il est également important de noter que si votre id
colonne est une colonne à auto-incrémentation, vous pouvez aussi bien l'omettre de votre INSERT et laisser mysql l'incrémenter comme d'habitude.
If you're trying to insert a new row with ID 1 you should be using
INSÉRER DANS. Dans votre cas, vous essayez d'insérer lorsque l'ID 1 existe déjà et qu'il s'agit d'une clé primaire ou unique et échoue, vous devez donc utiliser la syntaxe UPDATE ou INSERT .. Syntaxe ON DUPLICATE KEY
Vous ne pouvez pas combiner une clause WHERE avec une clause VALUES. Vous avez deux options pour autant que je sache -
INSÉRER en spécifiant des valeurs
INSERT INTO Users(weight, desiredWeight)
VALUES (160,145)
INSERT à l'aide d'une instruction SELECT
INSERT INTO Users(weight, desiredWeight)
SELECT weight, desiredWeight
FROM AnotherTable
WHERE id = 1
Vous utilisez la clause WHERE pour les requêtes UPDATE. Lorsque vous INSERT, vous supposez que la ligne n'existe pas.
La déclaration du PO deviendrait alors;
UPDATE Users SET weight = 160, désiréWeight = 45 où id = 1;
Dans MySQL, si vous souhaitez INSERT ou UPDATE, vous pouvez utiliser la requête REPLACE avec une clause WHERE. Si le WHERE n'existe pas, il INSERTS, sinon il MISE À JOUR.
ÉDITER
Je pense que l'argument de Bill Karwin est suffisamment important pour sortir des commentaires et le rendre très évident. Merci Bill, cela fait trop longtemps que je n'ai pas travaillé avec MySQL, je me suis souvenu que j'avais des problèmes avec REPLACE, mais j'ai oublié ce qu'ils étaient. J'aurais dû le chercher.
Ce n'est pas ainsi que fonctionne REPLACE de MySQL. Il fait un DELETE (qui peut être un no-op si la ligne n'existe pas), suivi d'un INSERT. Pensez aux conséquences vis-à-vis. déclencheurs et dépendances de clé étrangère. À la place, utilisez INSERT ... ON DUPLICATE KEY UPDATE.
Les conditions s'appliquent car vous pouvez utiliser la condition where pour les instructions de sous-sélection. Vous pouvez effectuer des insertions compliquées à l'aide de sous-sélections.
Par exemple:
INSERT INTO suppliers
(supplier_id, supplier_name)
SELECT account_no, name
FROM customers
WHERE city = 'Newark';
En plaçant un "select" dans l'instruction d'insertion, vous pouvez effectuer rapidement plusieurs insertions.
Avec ce type d'insertion, vous souhaiterez peut-être vérifier le nombre de lignes insérées. Vous pouvez déterminer le nombre de lignes qui seront insérées en exécutant l'instruction SQL suivante avant d'effectuer l'insertion.
SELECT count(*)
FROM customers
WHERE city = 'Newark';
Vous pouvez vous assurer que vous n'insérez pas d'informations en double à l'aide de la condition EXISTS.
Par exemple, si vous aviez une table nommée clients avec une clé primaire de client_id, vous pouvez utiliser l'instruction suivante:
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);
Cette instruction insère plusieurs enregistrements avec une sous-sélection.
Si vous souhaitez insérer un seul enregistrement, vous pouvez utiliser l'instruction suivante:
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);
L'utilisation de la table double vous permet de saisir vos valeurs dans une instruction de sélection, même si les valeurs ne sont pas actuellement stockées dans une table.
Voir aussi Comment insérer avec la clause where
La bonne réponse à cette question sera qc comme ceci:
une). SI vous voulez sélectionner avant l'insertion:
INSERT INTO Users( weight, desiredWeight )
select val1 , val2 from tableXShoulatNotBeUsers
WHERE somecondition;
b). Si l'enregistrement existe déjà, utilisez la mise à jour au lieu d'insérer:
INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;
Devrait être
Update Users set weight=160, desiredWeight=145 WHERE id = 1;
c). Si vous souhaitez mettre à jour ou insérer en même temps
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
ré). Si vous souhaitez CLONE un enregistrement de la même table, rappelez-vous simplement que vous ne pouvez pas sélectionner la table dans laquelle vous insérez par conséquent
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;
Je pense que cela couvre la plupart des scénarios
Vous ne pouvez tout simplement pas utiliser WHERE lors d'une instruction INSERT:
INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;
devrait être:
INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 );
La partie WHERE ne fonctionne que dans les instructions SELECT:
SELECT from Users WHERE id = 1;
ou dans les instructions UPDATE:
UPDATE Users set (weight = 160, desiredWeight = 145) WHERE id = 1;
Vous pouvez effectuer une INSERT conditionnelle en fonction de l'entrée de l'utilisateur. Cette requête ne sera insérée que si les variables d'entrée '$ userWeight' et '$ userDesiredWeight' ne sont pas vides
INSERT INTO Users(weight, desiredWeight )
select '$userWeight', '$userDesiredWeight'
FROM (select 1 a ) dummy
WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';
Cela dépend de la situation INSERT peut en fait avoir une clause where.
Par exemple, si vous faites correspondre les valeurs d'un formulaire.
Consider INSERT INTO Users(name,email,weight, desiredWeight) VALUES (fred,bb@yy.com,160,145) WHERE name != fred AND email != bb@yy.com
Cela a du sens, n'est-ce pas?
Le moyen le plus simple consiste à utiliser IF pour violer votre contrainte de clé. Cela ne fonctionne que pour INSERT IGNORE mais vous permettra d'utiliser la contrainte dans un INSERT.
INSERT INTO Test (id, name) VALUES (IF(1!=0,NULL,1),'Test');
La WHERE
clause After vous placez une condition et elle est utilisée pour récupérer des données ou pour mettre à jour une ligne. Lorsque vous insérez des données, on suppose que la ligne n'existe pas.
Donc, la question est, y a-t-il une ligne dont l'ID est 1? si tel est le cas, utilisez MySQL UPDATE , sinon utilisez MySQL INSERT .
Si vous spécifiez un numéro d'enregistrement particulier pour insérer des données, il est préférable d'utiliser une UPDATE
instruction plutôt qu'une INSERT
instruction.
Ce type de requête que vous avez écrit dans la question est comme une requête factice.
Votre requête est: -
INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;
Ici, vous spécifiez l'id = 1, il vaut donc mieux utiliser l' UPDATE
instruction pour mettre à jour l'enregistrement existant.Il n'est pas recommandé d'utiliser la WHERE
clause dans le cas de INSERT
.You devrait utiliser UPDATE
.
Maintenant en utilisant la requête de mise à jour: -
UPDATE Users SET weight=160,desiredWeight=145 WHERE id=1;
La clause WHERE peut-elle être réellement utilisée avec INSERT-INTO-VALUES dans tous les cas?
La réponse est définitivement non.
L'ajout d'une clause WHERE après INSERT INTO ... VALUES ... n'est qu'un SQL non valide et n'analysera pas.
L'erreur renvoyée par MySQL est:
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
La partie la plus importante du message d'erreur est
... syntax to use near 'WHERE id = 1' ...
qui montre la partie spécifique que l'analyseur ne s'attendait pas à trouver ici: la clause WHERE.
Non. Pour autant que je sache, vous ne pouvez pas ajouter la clause WHERE dans cette requête. Peut-être que j'ai aussi oublié mon SQL, car je ne sais pas vraiment pourquoi vous en avez besoin de toute façon.
Vous ne devez pas utiliser la condition where dans l'instruction Insert. Si vous le souhaitez, utilisez l'insertion dans une instruction de mise à jour, puis mettez à jour un enregistrement existant.
En fait, puis-je savoir pourquoi vous avez besoin d'une clause where dans l'instruction Insert ??
Peut-être en fonction de la raison pour laquelle je pourrais vous suggérer une meilleure option.
Je pense que votre meilleure option est d'utiliser REPLACE à la place INSERT
REMPLACER EN Utilisateurs (id, poids, poids souhaité) VALEURS (1, 160, 145);
Cela n'a pas de sens ... même littéralement
INSERT
signifie ajouter un new row
et quand vous dites que WHERE
vous définissez de quelle ligne vous parlez dans le SQL
.
Ainsi, l'ajout d'une nouvelle ligne n'est pas possible avec une condition sur une ligne existante.
Vous devez choisir parmi les éléments suivants:
A. Utilisez à la UPDATE
place deINSERT
Utilisez INSERT
et supprimez la WHERE
clause (je le dis juste ...) ou si vous êtes vraiment obligé d'utiliser INSERT
et WHERE
dans une seule instruction, cela ne peut être fait que via la clause INSERT..SELECT ...
INSERT INTO Users( weight, desiredWeight )
SELECT FROM Users WHERE id = 1;
Mais cela sert un objectif entièrement différent et si vous avez défini id comme clé primaire, cette insertion sera un échec, sinon une nouvelle ligne sera insérée avec id = 1.
Je suis conscient qu'il s'agit d'un ancien message mais j'espère que cela aidera encore quelqu'un, avec ce que j'espère être un exemple simple:
Contexte:
J'ai eu un cas plusieurs à plusieurs: le même utilisateur est répertorié plusieurs fois avec plusieurs valeurs et je voulais créer un nouvel enregistrement, donc UPDATE n'aurait pas de sens dans mon cas et je devais m'adresser à un utilisateur particulier comme je le ferais en utilisant une clause WHERE.
INSERT into MyTable(aUser,aCar)
value(User123,Mini)
En utilisant cette construction, vous ciblez en fait un utilisateur spécifique (user123, qui a d'autres enregistrements) donc vous n'avez pas vraiment besoin d'une clause where, je suppose.
la sortie pourrait être:
aUser aCar
user123 mini
user123 HisOtherCarThatWasThereBefore
la syntaxe correcte pour l'insertion de mysql dans l'instruction en utilisant la méthode post est:
$sql="insert into ttable(username,password) values('$_POST[username]','$_POST[password]')";
je ne pense pas que nous pouvons utiliser la clause where dans l'instruction insert
INSERT INTO Users(weight, desiredWeight )
SELECT '$userWeight', '$userDesiredWeight'
FROM (select 1 a ) dummy
WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';
Vous ne pouvez pas utiliser INSERT et WHERE ensemble. Vous pouvez utiliser la clause UPDATE pour ajouter de la valeur à une colonne particulière dans un champ particulier comme le code ci-dessous;
UPDATE Users
SET weight='160',desiredWeight ='145'
WHERE id =1
Je pense que la forme correcte pour insérer une valeur sur une ligne spécifiée est:
UPDATE table SET column = value WHERE columnid = 1
cela fonctionne et est similaire si vous écrivez sur Microsoft SQL Server
INSERT INTO table(column) VALUES (130) WHERE id = 1;
sur mysql, vous devez mettre à jour la table.