141 votes

INSERT INTO vs SELECT INTO

Quelle est la différence entre l'utilisation de

SELECT ... INTO MyTable FROM...

et

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

?

De BOL [ INSÉRER, SÉLECTIONNEZ... ], je sais que l'utilisation de SELECT...INTO permettra de créer de l'insertion de la table sur le fichier par défaut du groupe si elle n'existe pas déjà, et que l'enregistrement de cette déclaration repose sur le modèle de récupération de la base de données.

  1. L'instruction qui est préférable?
  2. Il y a des implications sur les performances?
  3. Ce qui est un bon cas d'utilisation pour SÉLECTIONNER...EN plus de l'INSÉRER DANS ...?

Edit: j'ai déjà dit que je sais que cela, SÉLECTIONNEZ DANS... crée une table où il n'existe pas. Ce que je veux savoir, c'est que SQL inclut cette déclaration pour une raison, c'est quoi? Est-il en train de faire quelque chose de différent dans les coulisses pour l'insertion de lignes, ou est-ce juste syntaxique de sucre sur le dessus d'un CREATE TABLE et INSERT INTO.

135voto

JNK Points 32743
  1. Ils font des choses différentes. Utiliser INSERT lorsque l'existence de la table. Utiliser SELECT INTO quand il n'a pas.

  2. Oui. INSERT avec aucun des indicateurs de table est normalement connecté. SELECT INTO est faiblement connecté en supposant la bonne indicateurs de suivi sont définies.

  3. Dans mon expérience, SELECT INTO est le plus couramment utilisé avec l'intermédiaire des ensembles de données, comme #temp tables, ou pour copier l'intégralité d'une table comme pour une sauvegarde. INSERT INTO est utilisé lors de l'insertion dans une table existante avec une structure connue.

MODIFIER

À l'adresse de votre édition, ils font des choses différentes. Si vous êtes un tableau et souhaitez définir l'utilisation des structures en CREATE TABLE et INSERT. Exemple d'une question qui peut être créé: Vous avez une petite table avec un champ de type varchar. La plus grande chaîne dans votre table dès maintenant est de 12 octets. Votre jeu de données réelles jusqu'à 200 octets. Si vous n' SELECT INTO de votre petite table pour en faire une nouvelle, plus tard INSERT échouera avec une erreur de troncation parce que vos champs sont trop petites.

28voto

HLGEM Points 54641
  1. L'instruction qui est préférable? Dépend de ce que vous faites.

  2. Il y a des implications sur les performances? Si la table est un permananent table, vous pouvez créer des index au moment de la création de la table qui a des implications pour la performance à la fois négative et positiviely. Sélectionnez dans ne pas recréer les index qui existent sur les tables et donc de l'utilisation ultérieure de la table peut être plus lente qu'elle ne doit l'être.

  3. Ce qui est un bon cas d'utilisation pour SÉLECTIONNER...EN plus de l'INSÉRER DANS ...? Sélectionnez dans est utilisée si vous ne pouvez pas savoir la structure de la table à l'avance. Il est plus rapide à écrire que créer une table et d'un insert staetment, de sorte qu'il est utilisé pour accélérer la dynamique de croissance à la fois. Il est souvent plus rapide d'utiliser lors de la création d'un rapide table temp de tester des choses ou une table de sauvegarde d'une requête spécifique (peut-être des enregistrements à supprimer). Il doit être rare de voir qu'il est utilisé dans la production de code qui sera exécuté plusieurs fois (sauf pour les tables temporaires), parce qu'il va échouer si la table était déjà dans l'existence.

Il est parfois utilisé à mauvais escient par des personnes qui ne savent pas ce qu'ils font. Et ils peuvent causer des ravages dans la db. Je crois fermement qu'il est inapproprié d'utiliser SELECT INTO pour autre chose qu'un jetable table (une sauvegarde temporaire, d'une table temporaire qui disparaîtra à la fin de la procédure stockée ,etc.). Tables permanentes besoin réel de la pensée comme de leur conception, et SÉLECTIONNEZ DANS le rend facile pour éviter de penser à rien, même le plus élémentaire, comme les colonnes et quels types de données.

En général, je préfère l'utilisation de la table et de l'instruction insert - vous avez plus de contrôle et il est préférable de processus reproductibles. De plus, si la table est une table permanente, il doit être créé à partir d'un autre script de création de table (celle qui est en contrôle de la source) que la création d'objets permanents doivent pas, en général, dans le code que les insertions/suppressions/mises à jour ou sélectionne à partir d'une table. Modifications de l'objet doivent être manipulés séparément des modifications de données, car les objets ont des conséquences qui dépassent les besoins spécifiques d'un insert/update/sélectionner/supprimer. Vous avez besoin de réfléchir à la meilleure des types de données, vous devez penser à la FK contraintes et PKs et d'autres contraintes, vous devez tenir compte des exigences d'audit, vous devez penser à propos de l'indexation, etc.

7voto

Joe Stefanelli Points 72874

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

SELECT...INTO MyTable... crée un nouveau MyTable s'il n'en existait pas auparavant.

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

6voto

rsbarro Points 12575

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

Vous utilisez SÉLECTIONNEZ uniquement dans le cas où la table n'existait pas et que tu voulais créer sur la base les résultats de votre requête. En tant que tels, ces deux affirmations ne sont pas vraiment comparables. Ils font des choses très différentes.

En général, SÉLECTIONNEZ EN est plus souvent utilisé pour l'une des tâches, tout en INSERT INTO est régulièrement utilisé pour ajouter des lignes de tables.

EDIT:
Alors que vous pouvez utiliser CREATE TABLE et INSÉREZ-la DANS pour accomplir ce qu'SÉLECTIONNEZ DANS, SÉLECTIONNEZ DANS vous n'avez pas à savoir la définition de la table à l'avance. SÉLECTIONNEZ EN est probablement inclus dans SQL, car il rend les tâches comme la création de rapports ad hoc ou de la copie de tables beaucoup plus facile.

5voto

AJC Points 1425

En fait SELECT ... INTO ne crée pas seulement de la table, mais échouera si elle existe déjà, donc, fondamentalement, la seule fois que vous pouvez l'utiliser, c'est quand le tableau inséré à n'existe pas.

En ce qui concerne votre EDIT:

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

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