web-dev-qa-db-fra.com

MySQL INSERT INTO table VALUES .. vs INSERT INTO table SET

Quelle est la principale différence entre INSERT INTO table VALUES .. et INSERT INTO table SET?

Exemple:

INSERT INTO table (a, b, c) VALUES (1,2,3)

INSERT INTO table SET a=1, b=2, c=3

Et que dire de la performance de ces deux-là?

237
Irmantas

Autant que je sache, les deux syntaxes sont équivalentes. Le premier est le standard SQL, le second est l'extension de MySQL.

Ils devraient donc être tout à fait équivalents en termes de performances.

http://dev.mysql.com/doc/refman/5.6/en/insert.html dit:

INSERT insère de nouvelles lignes dans une table existante. Les formes INSERT ... VALUES et INSERT ... SET de l'instruction insèrent des lignes en fonction de valeurs spécifiées explicitement. Le formulaire INSERT ... SELECT insère les lignes sélectionnées dans une ou plusieurs tables.

184
Vinko Vrsalovic

Je pense que l'extension est destinée à permettre une syntaxe similaire pour les insertions et les mises à jour. Dans Oracle, une astuce syntaxique similaire est la suivante:

UPDATE table SET (col1, col2) = (SELECT val1, val2 FROM dual)
15
user69173

Comme les syntaxes sont équivalentes (de toute façon dans MySQL), je préfère la syntaxe INSERT INTO table SET x=1, y=2, car il est plus facile de modifier et de détecter les erreurs dans l’instruction, en particulier lors de l’insertion de nombreuses colonnes. Si vous devez insérer 10 ou 15 colonnes ou plus, il est vraiment facile de mélanger quelque chose en utilisant la syntaxe (x, y) VALUES (1,2), à mon avis.

Si la portabilité entre différents standards SQL pose problème, alors peut-être que INSERT INTO table (x, y) VALUES (1,2) serait préférable.

Et si vous souhaitez insérer plusieurs enregistrements dans une même requête, il ne semble pas que la syntaxe INSERT INTO ... SET fonctionne, alors que l'autre le fera. Mais dans la plupart des cas pratiques, vous parcourez un ensemble d’enregistrements pour faire des insertions, bien qu’il puisse arriver que vous construisiez une requête volumineuse pour insérer un groupe de lignes dans une table dans une requête, par opposition à une requête pour. chaque ligne peut avoir une amélioration de la performance. Je ne sais vraiment pas.

4
Aaron Wallentine