Requête MySQL Insert Where

121

Quel est le problème avec cette requête:

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

Cela fonctionne sans la WHEREclause. J'ai semblé avoir oublié mon SQL.

Taryn
la source

Réponses:

237

La syntaxe MySQL INSERT ne prend pas en charge la clause WHERE, donc votre requête en l'état échouera. En supposant que votre idcolonne 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 idcolonne est une colonne à auto-incrémentation, vous pouvez aussi bien l'omettre de votre INSERT et laisser mysql l'incrémenter comme d'habitude.

Chad Birch
la source
1
Merci pour une bonne réponse. Lors de l'utilisation de la requête UPDATE, cela fonctionne correctement. Mais, lorsque id est une clé primaire et une clé d'incrémentation automatique, l'instruction INSERT ci-dessus ne fonctionne pas.Erreur Entrée dupliquée '1' pour la clé 1.
JDGuide
1
@JDeveloper C'est parce que la ligne existe déjà. Comme le Tchad l'a mentionné, If you're trying to insert a new row with ID 1 you should be usingINSÉ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
Anthony Hatzopoulos
41

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

  1. INSÉRER en spécifiant des valeurs

    INSERT INTO Users(weight, desiredWeight) 
    VALUES (160,145)
  2. INSERT à l'aide d'une instruction SELECT

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

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.

Rob Prouse
la source
7
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.
Bill Karwin le
10

Je ne pense pas que l'encart contienne une clause WHERE.

Daniel A. White
la source
C'est vrai et sable en même temps!
Ingus
5

La requête d'insertion ne prend pas en charge le mot clé where *

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

Somnath Muluk
la source
4

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

sakhunzai
la source
3

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;
Borniet
la source
2

Insérer dans = Ajout de lignes à un tableau

Upate = mettre à jour des lignes spécifiques.

Que décrirait la clause where dans votre encart? Il n'y a rien qui corresponde, la ligne n'existe pas (encore) ...

Richard L
la source
2

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'!='';
Igor Vujovic
la source
1

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?

Frank Nwoko
la source
est-il possible où clause dans insérer une déclaration
Taja_100
1

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');
Ethan Brooks
la source
1

La WHEREclause 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 .

Revathi
la source
1

Si vous spécifiez un numéro d'enregistrement particulier pour insérer des données, il est préférable d'utiliser une UPDATEinstruction plutôt qu'une INSERTinstruction.

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' UPDATEinstruction pour mettre à jour l'enregistrement existant.Il n'est pas recommandé d'utiliser la WHEREclause 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;
JDGuide
la source
Aucune requête mate.1st ne fonctionnera. La première requête est la question posée.
JDGuide
Pourquoi suggérez-vous la mise à jour par insertion? L'utilisateur souhaite insérer des valeurs avec condition et ne pas mettre à jour les enregistrements existants.
Somnath Muluk
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.

Marc Alff
la source
1

son tout faux. INSERT QUERY n'a pas de clause WHERE, seule UPDATE QUERY l'a. Si vous souhaitez ajouter des données où id = 1, votre requête sera

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

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.

Ikechi Anyanwu
la source
1

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.

Krishna Thota
la source
1

Je pense que votre meilleure option est d'utiliser REPLACE à la place INSERT

REMPLACER EN Utilisateurs (id, poids, poids souhaité) VALEURS (1, 160, 145);

Alberto León
la source
1

LISEZ CECI AUSSI BIEN

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

INSERTsignifie ajouter un new rowet quand vous dites que WHEREvous 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 UPDATEplace deINSERT

Utilisez INSERTet supprimez la WHEREclause (je le dis juste ...) ou si vous êtes vraiment obligé d'utiliser INSERTet WHEREdans 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.

Bharat Sinha
la source
oui, vous avez raison, sachant que toutes ces choses font des erreurs.
Asesha George
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
Ylenia88m
la source
1

Une façon d'utiliser INSERT et WHERE est

INSERT INTO MYTABLE SELECT 953,'Hello',43 WHERE 0 in (SELECT count(*) FROM MYTABLE WHERE myID=953); Dans ce cas, c'est comme un test d'existence. Il n'y a pas d'exception si vous l'exécutez deux fois ou plus ...

Rob
la source
0

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]')";
chaitanya koripella
la source
1
Vous devez échapper aux paramètres non approuvés tels que le nom d'utilisateur ou utiliser des requêtes paramétrées pour empêcher un attaquant d' injecter des commandes SQL arbitraires . Et utilisez l'un des algorithmes HashCrypt pour stocker le mot de passe.
Hendrik Brummermann
0

je ne pense pas que nous pouvons utiliser la clause where dans l'instruction insert

Nipun Jain
la source
0
INSERT INTO Users(weight, desiredWeight )
SELECT '$userWeight', '$userDesiredWeight'  
FROM (select 1 a ) dummy
WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';
user6297694
la source
1
Pouvez-vous modifier votre proposition de réponse pour expliquer ce que cela fait et comment cela répond au PO?
Ro Yo Mi
0

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
Vishal Vaishnav
la source
0

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.

Jonathan JS
la source
0

Vous pouvez le faire avec le code ci-dessous:

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