153 votes

La requête d'insertion MySQL ne fonctionne pas avec la clause WHERE

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

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

Il fonctionne sans le WHERE clause. On dirait que j'ai oublié mon SQL.

280voto

Chad Birch Points 39087

MySQL Syntaxe INSERT ne prend pas en charge la clause WHERE et votre requête telle qu'elle est échouera. En supposant que votre id est unique ou une clé 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 changer les valeurs de poids/poids désiré pour une ligne existante avec l'ID 1, vous devriez utiliser :

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

Si vous voulez, 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 est une colonne à incrémentation automatique, vous pouvez tout aussi bien l'omettre de votre INSERT et laisser mysql l'incrémenter normalement.

50voto

Russ Cam Points 58168

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

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

24voto

Rob Prouse Points 9193

Vous utilisez la clause WHERE pour les requêtes UPDATE. Lorsque vous INSERTEZ, vous supposez que la ligne n'existe pas.

La déclaration de l'OP deviendrait alors ;

UPDATE Users SET weight = 160, desiredWeight = 45 where id = 1 ;

Dans MySQL, si vous voulez faire un INSERT ou un UPDATE, vous pouvez utiliser la requête REPLACE avec une clause WHERE. Si le WHERE n'existe pas, il y a INSERTION, sinon il y a MISE À JOUR.

EDIT

Je pense que le point de vue 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 souviens que j'ai eu des problèmes avec REPLACE, mais j'ai oublié ce qu'ils étaient. J'aurais dû faire des recherches.

Ce n'est pas comme ça que le REPLACE de MySQL fonctionne. Il effectue un DELETE (qui peut être un no-op si la ligne n'existe pas), suivi d'un INSERT. Pensez aux conséquences sur les triggers et les dépendances de clés étrangères. Utilisez plutôt INSERT...ON DUPLICATE KEY UPDATE.

13voto

Daniel A. White Points 91889

Je ne pense pas que l'insert ait une clause WHERE.

7voto

Somnath Muluk Points 10173

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

Les conditions s'appliquent parce que vous pouvez utiliser la condition where pour les déclarations de sous-sélection. Vous pouvez effectuer des insertions complexes 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 l'instruction d'insertion, vous pouvez effectuer rapidement plusieurs insertions.

Avec ce type d'insertion, vous pouvez souhaiter 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 en utilisant la condition EXISTS.

Par exemple, si vous avez 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 vouliez insérer un seul enregistrement, vous pourriez 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 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X