VALEURS INSERT INTO table MySQL vs INSERT INTO table SET

252

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 qu'en est-il des performances de ces deux?

Irmantas
la source
12
Après avoir lu Code Complete et l'accent constant de McConnell sur la lisibilité, il semble regrettable que ce INSERT INTO table SETne soit pas standard. Cela semble beaucoup plus clair. Je suppose que je devrai INSERT INTO table ([column name, column name b]) VALUES (['value a', 'value b'])quand même utiliser la syntaxe pour me sauver des ennuis si je porte sur Postgres.
cluelesscoder

Réponses:

195

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 exactement é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 basées sur des valeurs explicitement spécifiées. Le formulaire INSERT ... SELECT insère des lignes sélectionnées dans une ou plusieurs autres tables.

Vinko Vrsalovic
la source
4
Comment INSÉRER plusieurs valeurs à l'aide INSERT INTO table SET? Est-ce seulement possible?
pixelfreak
2
Que voulez-vous dire? L'exemple de l'OP dit SET a = 1, b = 2, c = 3, ce qui est plusieurs valeurs à ma connaissance.
Vinko Vrsalovic
10
Je voulais dire, INSÉRER plusieurs lignes. Comme: INSERT INTO table (a, b, c) VALUES (1,2,3), (4,5,6), (7,8,9);
pixelfreak
5
Seules les instructions INSERT qui utilisent la syntaxe VALUES peuvent insérer plusieurs lignes.
Vinko Vrsalovic
8
@VinkoVrsalovic, pas vrai, la sélection d'insertion peut également insérer plusieurs lignes lorsque plusieurs lignes sont sélectionnées
Pacerier
15

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:

UPDATE table SET (col1, col2) = (SELECT val1, val2 FROM dual)
fthiella
la source
5
@Pacerier Comme? Le seul problème que je vois est un problème de portabilité (qui, dans de nombreux contextes, n'a pas vraiment d'importance); est-ce que je manque quelque chose?
Mark Amery
1
@MarkAmery, oui quand vous le regardez, il n'y a pas de réel avantage. L'inconvénient est une perte de temps inutile , toute l'existence de ce fil prouve mon point.
Pacerier
8
@Pacerier Je ne suis pas sûr de voir votre point? Quel temps perdu? Il y a un avantage, qui a déjà été souligné: vous n'avez besoin de faire une boucle sur un tableau de paires clé / valeur qu'une fois pour créer votre instruction INSERT, au lieu de deux comme vous auriez besoin d'utiliser la syntaxe VALUES, ce qui conduit à une plus courte, plus claire et un code plus rapide à écrire.
Mark Amery
@MarkAmery mais cette astuce oracle n'a pas ont cet avantage. Vous nommez d'abord toutes les colonnes, puis toutes les valeurs.
hobbs
12
@Pacerier C'est un bon point, et il y a un compromis à peser. Contre cette fonctionnalité, vous avez des problèmes de portabilité et du temps perdu à rechercher la différence entre INSERT ... SET ...et INSERT ... VALUES .... Pour la fonctionnalité, vous disposez d'un code plus court et plus rapide à écrire, d'une lisibilité accrue et de l'élimination des fautes de frappe causées par le mélange de l'ordre des colonnes lors de l'écriture de votre VALUESclause. Mon instinct me dit que sur le net, le bien l'emporte sur le mal, mais votre jugement peut différer.
Mark Amery
4

Étant donné que les syntaxes sont équivalentes (dans MySQL de toute façon), je préfère la INSERT INTO table SET x=1, y=2syntaxe, car elle est plus facile à modifier et à 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 (x, y) VALUES (1,2)syntaxe, à mon avis.

Si la portabilité entre différentes normes SQL est un problème, alors peut INSERT INTO table (x, y) VALUES (1,2)-être serait préférable.

Et si vous souhaitez insérer plusieurs enregistrements dans une seule requête, il ne semble pas que la INSERT INTO ... SETsyntaxe fonctionnera, tandis que l'autre le fera. Mais dans la plupart des cas pratiques, vous parcourez un ensemble d'enregistrements pour effectuer des insertions de toute façon, bien qu'il puisse y avoir des cas où peut-être la construction d'une grande requête pour insérer un groupe de lignes dans une table dans une seule requête, par rapport à une requête pour chaque ligne, pourrait avoir une amélioration des performances. Je ne sais vraiment pas.

Aaron Wallentine
la source