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.
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.
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.
Vous ne pouvez pas combiner une clause WHERE avec une clause VALUES. Pour autant que je sache, vous avez deux options
INSERT 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 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.
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 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.