1815 votes

Insertion de plusieurs lignes dans une seule requête SQL ?

J'ai plusieurs ensembles de données à insérer en même temps, disons 4 lignes. Mon tableau comporte trois colonnes : Person , Id et Office .

INSERT INTO MyTable VALUES ("John", 123, "Lloyds Office");
INSERT INTO MyTable VALUES ("Jane", 124, "Lloyds Office");
INSERT INTO MyTable VALUES ("Billy", 125, "London Office");
INSERT INTO MyTable VALUES ("Miranda", 126, "Bristol Office");

Puis-je insérer les 4 lignes dans une seule instruction SQL ?

6 votes

Note du modérateur : Veuillez adresser toute discussion sur le bien-fondé de cette question à ce méta post .

4 votes

Pour oracle sql, voir stackoverflow.com/a/93724/1452172

0 votes

Pour insérer plusieurs enregistrements dans une ligne, vous pouvez également essayer ceci Exemple : insérer dans tablename (col1 ,col2) select uid,uname from usertable ;

2404voto

Diago Points 6899

En SQL Server 2008, vous pouvez insérer plusieurs lignes à l'aide d'une seule instruction SQL INSERT.

INSERT INTO Table ( Column1, Column2 ) VALUES
( Value1, Value2 ), ( Value1, Value2 )

Pour y faire référence, consultez le cours MOC 2778A - Writing SQL Queries in SQL Server 2008.

402 votes

Et veuillez noter que le nombre maximum de lignes dans une instruction d'insertion est de 1000.

203 votes

Il faudrait plutôt dire "le nombre maximum de lignes dans une ligne VALUES est de 1000". Ce n'est pas le INSERT qui est limitée à 1000 lignes.

0 votes

@Anon Merci d'avoir clarifié le commentaire très trompeur de ChrisJ. Cela m'a évité un débogage douloureux :)

842voto

too much php Points 27983

Si vous insérez dans une seule table, vous pouvez écrire votre requête comme ceci (peut-être seulement dans MySQL) :

insert into table1 (First,Last) values ('Fred','Smith'),
  ('John','Smith'),
  ('Michael','Smith'),
  ('Robert','Smith');

55 votes

À partir de SQL Server 2008, cela fonctionnera si vous remplacez les guillemets doubles par des guillemets simples.

17 votes

Fonctionne également avec postgres v9.0

11 votes

Et avec SQLite

142voto

DavGarcia Points 9322

Vous pouvez utiliser INSERT avec SELECT UNION ALL :

INSERT INTO MyTable  (FirstCol, SecondCol)
    SELECT  'First' ,1
    UNION ALL
SELECT  'Second' ,2
    UNION ALL
SELECT  'Third' ,3
...

Mais uniquement pour les petits ensembles de données, ce qui devrait convenir pour vos 4 enregistrements.

0 votes

Ça a marché du premier coup, merci ! Je pourrais même ajouter des trucs supplémentaires comme : 'Before date: ' + date2str(GETDATE()) + ' after date.' Je sais que c'est une commande un peu étrange date2str mais c'est une syntaxe spéciale dans ma base de données.

87voto

INSERT les déclarations qui utilisent VALUES La syntaxe permet d'insérer plusieurs lignes. Pour ce faire, incluez plusieurs listes de valeurs de colonnes, chacune entre parenthèses et séparée par une virgule.

Exemple :

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

2 votes

Une meilleure question est : pourquoi le voudriez-vous ? Pourquoi ne pas exécuter les 4 commandes de nettoyage toutes ensemble dans un lot ? Si une ligne échoue, votre lot échoue. Si vous les faites individuellement et groupées, 3 des 4 réussissent.

10 votes

@m-t-head J'ai un exemple de pourquoi je veux le faire, et je vais vous donner 2 raisons. J'insère dans une table qui a un déclencheur de vérification de l'intégrité des données. Raison 1 - L'insertion de valeurs séparément violerait le contrôle d'intégrité, ce qui annulerait la transaction et renverrait une erreur. J'utilise SQL Server qui ne prend pas en charge les contraintes différées, donc même si au lieu d'un déclencheur, il s'agissait d'une contrainte ordinaire, cela ne fonctionnerait toujours pas. Raison 2 - le contrôle d'intégrité est une procédure coûteuse et je préfère qu'elle soit exécutée une fois plutôt que des milliers de fois par transaction. Je suis toujours à la recherche de solutions.

0 votes

Vous pouvez créer un CTE et utiliser insert into YourTable (ID,Name) From select ID,Name From CTE

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