MySQL Insert Where query

Qu'est-ce qui ne va pas avec cette requête:

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

il fonctionne sans la clause WHERE . J'ai semblaient avoir oublié mon SQL..

96
demandé sur Taryn 2009-01-27 23:16:11

24 réponses

MySQL INSÉRER une Syntaxe ne prend pas en charge la clause where de sorte que votre requête, comme il se échouera. En supposant que votre colonne id est unique ou clé primaire:

si vous essayez d'insérer une nouvelle ligne avec L'ID 1, vous devez utiliser:

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

si vous essayez de changer les valeurs de poids/poids désirés pour une rangée existante avec ID 1, vous devez utiliser:

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

si vous voulez peut également utiliser INSERT .. Sur la syntaxe de clé dupliquée comme ceci:

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

ou même ainsi:

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 colonne id est une colonne d'auto-injection alors vous pourriez aussi bien l'omettre de votre INSERT tous ensemble et laisser mysql l'incrémenter comme normal.

197
répondu Chad Birch 2012-08-08 20:15:16

vous ne pouvez pas combiner une clause WHERE avec une clause VALUES. Vous avez deux options pour autant que je sache -

  1. inscrire les valeurs spécifiées

    INSERT INTO Users(weight, desiredWeight) 
    VALUES (160,145)
    
  2. insérer en utilisant une instruction SELECT

    INSERT INTO Users(weight, desiredWeight) 
    SELECT weight, desiredWeight 
    FROM AnotherTable 
    WHERE id = 1
    
33
répondu Russ Cam 2013-08-02 10:37:18

vous utilisez la clause WHERE pour les requêtes de mise à jour. Lorsque vous insérez, vous supposez que la rangée n'existe pas.

dans MySQL, si vous voulez insérer ou mettre à jour, vous pouvez utiliser la requête REPLACE avec une clause WHERE. Si L'endroit n'existe pas, il insère, sinon il met à jour.

MODIFIER

je pense que le point de Bill Karwin est assez important pour sortir des commentaires et, il est très évident. Merci Bill, ça 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. Je devrais l'avoir regardé.

ce N'est pas comme ça que fonctionne le remplacement de MySQL. Il fait une suppression (qui peut être une non-op si la ligne n'existe pas), suivie d'un INSERT. Pense aux conséquences vis. les déclencheurs et les clés étrangères des dépendances. Au lieu de cela, utiliser le menu INSÉRER...SUR LA MISE À JOUR DE LA CLÉ DUPLIQUÉE.

19
répondu Rob Prouse 2009-01-27 22:00:52

Je ne crois pas que l'insert ait une clause "où".

7
répondu Daniel A. White 2009-01-27 20:17:11

Insérer une requête ne prend pas en charge où le mot-clé*

Conditions s'appliquent parce que vous pouvez utiliser la condition where pour les déclarations de sous-sélection. Vous pouvez effectuer des inserts compliqués en utilisant des 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 la déclaration insert, vous pouvez effectuer des inserts multiples rapidement.

Avec ce type d'insertion, vous pouvez vérifier le nombre de lignes insérer. Vous pouvez déterminer le nombre de lignes qui seront insérées en exécutant la déclaration SQL suivante avant d'effectuer l'insertion.

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

vous pouvez vous assurer que vous n'insérez pas de renseignements en double en utilisant la condition existe.

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 déclaration insère multiple les enregistrements avec une sous-sélection.

Si vous vouliez insérer un enregistrement unique, 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 double table vous permet d'entrer vos valeurs dans une instruction select, même si les valeurs ne sont pas stockées dans une table.

Voir aussi Comment insérer avec où la clause

5
répondu Somnath Muluk 2017-05-23 10:31:12

la bonne réponse à cette question sera sth comme ceci:

a). Si vous voulez sélectionner avant d'insérer:

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

b). Si l'enregistrement existe déjà, utilisez update 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 voulez 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

d). Si vous voulez cloner un disque de la même table, souvenez-vous de vous cann pas sélectionner de la table à laquelle vous insérez donc

 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 ce joli couvre la plupart des scénarios

4
répondu sakhunzai 2011-07-06 10:38:48

insérer dans = Ajouter des lignes à une table

Upate = mise à jour des lignes spécifiques.

que décrirait la clause "where" dans votre encart? Il n'y a rien à comparer, la rangée n'existe pas (encore)...

2
répondu Richard L 2009-01-27 20:20:41

vous ne pouvez tout simplement pas utiliser où en faisant un INSERT déclaration:

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

devrait être:

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

the WHERE part works only in SELECT statements:

SELECT from Users WHERE id = 1;

ou dans les déclarations de mise à jour:

UPDATE Users set (weight = 160, desiredWeight = 145) WHERE id = 1;
2
répondu Borniet 2012-08-09 12:43:49

LIRE AUSSI

Ça n'a pas de sens... même littéralement

INSERT signifie ajouter un new row et quand vous dites WHERE vous définissez De quelle ligne vous parlez dans le SQL .

ainsi l'ajout d'une nouvelle rangée n'est pas possible avec une condition sur une rangée existante.

vous devez choisir parmi les suivants:

A. Utiliser UPDATE au lieu de INSERT

B. Utiliser INSERT et supprimer WHERE clause ( je le dis simplement...) ou si vous êtes réellement tenu d'utiliser INSERT et WHERE dans une seule instruction, cela ne peut être fait que via insérer..Sélectionnez la clause ...

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

mais ceci sert un but tout à fait différent et si vous avez défini id comme clé primaire cet insert sera un échec, sinon une nouvelle rangée sera inséré avec id = 1.

2
répondu SiB 2012-08-11 08:48:09

cela dépend de la situation INSERT peut effectivement avoir une clause où.

par exemple, si vous avez les valeurs correspondantes 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

a du sens n'est-ce pas?

1
répondu Frank Nwoko 2011-01-15 20:23:19

la manière la plus simple est d'utiliser si pour violer votre une contrainte 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');
1
répondu Ethan Brooks 2011-12-06 22:42:26

après WHERE clause vous mettez une condition, et il est utilisé pour récupérer des données ou pour mettre à jour une rangée. Lorsque vous insérez des données, il est supposé que la ligne n'existe pas.

donc, la question Est, y a-t-il une rangée dont l'id est 1? dans l'affirmative, utilisez MySQL UPDATE , sinon utilisez MySQL INSERT .

1
répondu Revathi 2012-01-14 06:55:41

si vous spécifiez un no d'enregistrement particulier pour insérer des données il est préférable d'utiliser UPDATE statement au lieu de INSERT statement.

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, donc mieux vaut utiliser l'instruction UPDATE pour mettre à jour l'enregistrement existant.Il n 'est pas recommandé d' utiliser WHERE clause en cas de INSERT .Vous devez utiliser UPDATE .

Utilise Maintenant Update Query: -

UPDATE Users SET weight=160,desiredWeight=145 WHERE id=1;
1
répondu Java Developers Guide 2012-08-07 05:28:17

N'clause where peut être utilisé avec INSERT EN VALEURS cas?

, La réponse est définitivement non.

ajouter une clause WHERE après insérer dans ... VALEUR. .. est tout simplement invalide SQL, et ne parlera 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 où.

1
répondu Marc Alff 2012-08-07 19:37:25

c'est totalement faux. INSERT QUERY n'a pas de clause WHERE, seule update QUERY l'a. Si vous voulez ajouter des données où id = 1 alors votre requête sera

UPDATE Users SET weight=160, desiredWeight= 145 WHERE id = 1;
1
répondu Gurria 2012-08-10 10:39:01

Pas de. Pour autant que je sache, vous ne pouvez pas ajouter la clause WHERE dans cette requête. Peut-être que j'ai oublié mon SQL aussi, parce que je ne suis pas vraiment sûr pourquoi vous en avez besoin de toute façon.

1
répondu Ikechi Anyanwu 2012-08-11 05:14:17

Vous ne Devez pas utiliser condition dans la requête Insert. Si vous voulez le faire, utilisez insert dans une déclaration de mise à jour puis mettez à jour un enregistrement existant.

puis-je savoir pourquoi vous avez besoin d'une clause where dans la requête Insert??

peut-être à cause de la raison pour laquelle je vous suggère une meilleure option.

1
répondu Krishna Thota 2012-08-11 06:01:28

je pense que votre meilleure option est D'utiliser remplacer à la place insérer

remplacer par "Utilisateurs" (id, poids, poids nominal).(1, 160, 145);

1
répondu Alberto León 2012-08-11 08:03:16

vous pouvez faire l'insertion conditionnelle basée sur 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'!='';
1
répondu Igor Vujovic 2015-06-16 12:23:05

je suis conscient que c'est un vieux post, mais j'espère que cela va aider quelqu'un, avec ce que j'espère, c'est un exemple simple:

contexte:

j'ai eu beaucoup à beaucoup de cas: le même utilisateur est listé plusieurs fois avec des valeurs multiples et je voulais créer un nouvel enregistrement, donc la mise à jour n'aurait pas de sens dans mon cas et je devais adresser un utilisateur particulier juste comme je le ferais en utilisant une clause WHERE.

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

par en utilisant cette construction,vous ciblez en fait un utilisateur spécifique (user123, qui a d'autres enregistrements) de sorte que vous n'avez pas vraiment besoin d'une clause où, je pense.

la sortie pourrait être:

aUser   aCar
user123 mini
user123 HisOtherCarThatWasThereBefore
1
répondu Ylenia88m 2017-04-21 15:19:16

syntaxe correcte pour mysql insérer dans la déclaration en utilisant la méthode de post est:

$sql="insert into ttable(username,password) values('$_POST[username]','$_POST[password]')";
0
répondu chaitanya koripella 2012-04-27 17:10:37

Je ne pense pas que nous pouvons utiliser la clause où dans insérer la déclaration

0
répondu Nipun Jain 2012-08-04 12:00:33
INSERT INTO Users(weight, desiredWeight )
SELECT '$userWeight', '$userDesiredWeight'  
FROM (select 1 a ) dummy
WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';
0
répondu user6297694 2016-05-05 22:15:59

vous ne pouvez pas utiliser INSERT et où ensemble. Vous pouvez utiliser la clause de mise à jour pour ajouter de la valeur à une colonne particulière dans le champ particulier comme ci-dessous le code;

UPDATE Users
SET weight='160',desiredWeight ='145'  
WHERE id =1
0
répondu Vishal Vaishnav 2017-09-05 06:00:52