web-dev-qa-db-fra.com

INSERT INTO vs SELECT INTO

Quelle est la différence entre utiliser

SELECT ... INTO MyTable FROM...

et

INSERT INTO MyTable (...)
SELECT ... FROM ....

?

De BOL [ INSÉRER , SELECT ... INTO ], je sais que l’utilisation de SELECT ... INTO créera le tableau d’insertion sur le groupe de fichiers par défaut s’il ne le fait pas existe déjà et que la consignation de cette instruction dépend du modèle de récupération de la base de données.

  1. Quelle déclaration est préférable? 
  2. Y a-t-il d'autres implications sur les performances?
  3. Quel est un bon cas d'utilisation pour SELECT ... INTO sur INSERT INTO ...?

Edit: J'ai déjà indiqué que je sais que SELECT INTO ... crée une table où elle n'existe pas. Ce que je veux savoir, c'est que SQL inclut cette instruction pour une raison, qu'est-ce que c'est? S’agit-il de faire quelque chose de différent en coulisse pour l’insertion de lignes, ou s’agit-il simplement de sucre syntaxique par-dessus un CREATE TABLE et un INSERT INTO.

110
jowenece
  1. Ils font des choses différentes. Utilisez INSERT lorsque la table existe. Utilisez SELECT INTO quand ce n'est pas le cas. 

  2. Oui. INSERT sans indication de table est normalement enregistré. SELECT INTO est enregistré de manière minimale en supposant que les indicateurs de trace appropriés soient définis.

  3. D'après mon expérience, SELECT INTO est le plus souvent utilisé avec des ensembles de données intermédiaires, tels que des tables #temp, ou pour copier une table entière comme pour une sauvegarde. INSERT INTO est utilisé lorsque vous insérez dans une table existante avec une structure connue.

MODIFIER

Pour adresser votre édition, ils font des choses différentes. Si vous créez une table et souhaitez définir la structure, utilisez CREATE TABLE et INSERT. Exemple de problème pouvant être créé: Vous avez une petite table avec un champ varchar. La plus grande chaîne de votre table est maintenant de 12 octets. Votre jeu de données réel nécessitera jusqu'à 200 octets. Si vous utilisez SELECT INTO à partir de votre petite table pour en créer une nouvelle, la dernière INSERT échouera avec une erreur de troncature car vos champs sont trop petits.

106
JNK
  1. Quelle affirmation est préférable? Cela dépend de ce que vous faites.

  2. Y a-t-il d'autres implications sur les performances? Si la table est une table permanente, vous pouvez créer des index au moment de la création de la table, ce qui a des implications pour les performances, à la fois négativement et positivement. Select into ne recrée pas les index existant sur les tables actuelles et, par conséquent, l'utilisation ultérieure de la table peut être plus lente que nécessaire.

  3. Quel est un bon cas d'utilisation de SELECT ... INTO sur INSERT INTO ...? Sélectionnez dans est utilisé si vous ne connaissez peut-être pas la structure de la table à l’avance. Il est plus rapide d’écrire que de créer une table et une instruction d’insertion; elle est donc parfois utilisée pour accélérer le développement. Il est souvent plus rapide à utiliser lorsque vous créez une table temporaire rapide pour tester des éléments ou une table de sauvegarde d'une requête spécifique (par exemple, des enregistrements que vous allez supprimer). Il devrait être rare de le voir utilisé dans le code de production qui s'exécutera plusieurs fois (à l'exception des tables temporaires) car il échouera si la table existait déjà. 

Il est parfois utilisé de manière inappropriée par des personnes qui ne savent pas ce qu’elles font. Et ils peuvent causer des ravages dans la base de données. Je pense fortement qu'il est inapproprié d'utiliser SELECT INTO pour autre chose qu'une table jetable (une sauvegarde temporaire, une table temporaire qui disparaîtra à la fin de la procédure stockée, etc.). Les tables permanentes ont besoin de une vraie pensée quant à leur conception et SELECT INTO permet d’éviter de penser à quelque chose de même fondamental que quelles colonnes et quels types de données.

En général, je préfère utiliser l'instruction create table et insert: vous disposez de davantage de contrôles et il est préférable d'utiliser des processus répétables. De plus, si la table est une table permanente, elle doit être créée à partir d'un script de création de table distinct (qui se trouve dans le contrôle de code source), car la création d'objets permanents ne devrait pas, en général, être insérée/supprimée/mise à jour dans le code. table. Les modifications d'objet doivent être traitées séparément des modifications de données car les objets ont des implications dépassant les besoins d'une insertion/mise à jour/sélection/suppression spécifique. Vous devez prendre en compte les meilleurs types de données, réfléchir aux contraintes FK, aux PC et aux autres contraintes, prendre en compte les exigences en matière d'audit, envisager l'indexation, etc. 

20
HLGEM

La principale différence est que SELECT INTO MyTable créera une nouvelle table appelée MyTable avec les résultats, alors que INSERT INTO requiert que MyTable existe déjà.

Vous utiliseriez SELECT INTO uniquement dans le cas où la table n'existait pas et que vous souhaitiez la créer en fonction des résultats de votre requête. En tant que tels, ces deux déclarations ne sont vraiment pas comparables. Ils font des choses très différentes.

En général, SELECT INTO est utilisé plus souvent pour des tâches ponctuelles, alors que INSERT INTO est utilisé régulièrement pour ajouter des lignes à des tables.

MODIFIER:
Alors que vous pouvez utiliser CREATE TABLE et INSERT INTO pour accomplir ce que SELECT INTO fait, avec SELECT INTO vous n’avez pas besoin de connaître la définition de la table au préalable. SELECT INTO est probablement inclus dans SQL car il facilite beaucoup les tâches telles que la création de rapports ad hoc ou la copie de tables.

5
rsbarro

Chaque déclaration a un cas d'utilisation distinct. Ils ne sont pas interchangeables.

SELECT...INTO MyTable... crée une nouvelle MyTable où il n'en existait pas auparavant. 

INSERT INTO MyTable...SELECT... est utilisé lorsque MyTable existe déjà.

4
Joe Stefanelli

En fait, SELECT ... INTO non seulement crée la table mais échouera si elle existe déjà. Par conséquent, le seul moment où vous l'utiliseriez est lorsque la table dans laquelle vous insérez n'existe pas.

En ce qui concerne votre modification:

Personnellement, j'utilise principalement SELECT ... INTO lorsque je crée une table temporaire. Pour moi, c'est l'utilisation principale. Cependant, je l'utilise également lors de la création de nouvelles tables avec de nombreuses colonnes avec des structures similaires à d'autres tables, puis je les édite afin de gagner du temps.

4
AJC

SELECT INTO est généralement utilisé pour générer des tables temporaires ou pour copier une autre table (données et/ou structure). 

Dans le code journalier, vous utilisez INSERT car vos tables doivent déjà exister pour être lues, UPDATEd, DELETEd, JOINed, etc. Remarque: le mot clé INTO est facultatif avec INSERT.

Autrement dit, les applications ne créent ni ne suppriment normalement de tables dans le cadre d'opérations normales, à moins qu'il ne s'agisse d'une table temporaire pour un usage limité et spécifique.

Une table créée par SELECT INTO n'aura pas de clé, d'index ou de contrainte contrairement à une table réelle, persistante et déjà existante.

Les 2 ne sont pas directement comparables car ils ne se chevauchent presque pas

2
gbn

Je veux seulement aborder le deuxième point de la question qui concerne les performances, car aucun autre organe n’a abordé cette question. Select Into est beaucoup plus rapide que l'insertion dans les tableaux contenant de grands ensembles de données. Je préfère choisir dans quand je dois lire un très grand tableau. insérer dans pour une table de 10 millions de lignes peut prendre des heures, alors que sélectionner dans le fera en quelques minutes. Pour ce qui est de perdre des index sur une nouvelle table, vous pouvez recréer les index par requête et économiser encore plus de temps par rapport insérer dans. 

1
Niraj

Sélectionnez dans crée une nouvelle table pour vous à ce moment-là, puis insérez-y des enregistrements à partir de la table source. La table nouvellement créée a la même structure que la table source.Si vous essayez d’utiliser select dans une table existante, cela produira une erreur car il essaiera de créer une nouvelle table du même nom .. la table doit exister dans votre base de données avant que vous y insériez des lignes.

0
Satish Vishwakarma

La différence simple entre sélectionner dans et insérer dans est la suivante: --> sélectionner dans n'a pas besoin de tableau existant. Si vous voulez copier les données de la table A, il vous suffit de taper Select * INTO [nom de table] à partir de A. Ici, nom de table peut être une table existante ou une nouvelle table sera créée avec la même structure que la table A.

-> Insert Into nécessite une table existante.INSERT INTO [nom_table] SELECT * FROM A; . Ici nom_table est une table existante.

Il est généralement plus courant de sélectionner Into pour copier des données, en particulier des données de sauvegarde.

Vous pouvez utiliser selon vos besoins, c'est le choix du développeur qui devrait être utilisé dans son scénario.

Performance sage Insert INTO est rapide.

Références :

https://www.w3schools.com/sql/sql_insert_into_select.asphttps://www.w3schools.com/sql/sql_select_into.asp

0
Aditya Parmar