2010-09-21 7 views
40

J'utilise Postgres, et j'ai un grand nombre de lignes qui doivent être insérées dans la base de données, qui ne diffèrent que par un nombre entier qui est incrémenté. Pardonnez ce qui peut être une question stupide, mais je ne suis pas un gourou de la base de données. Est-il possible d'entrer directement une requête SQL qui utilisera une boucle pour insérer par programmation les lignes?Comment utiliser une boucle SQL for pour insérer des lignes dans la base de données?

Exemple en pseudo-code de ce que je suis en train de faire:

for i in 1..10000000 LOOP 
    INSERT INTO articles VALUES(i) 
end loop; 
+0

Il serait utile de connaître la version de PostgreSQL que vous utilisez. –

+0

@OMG Ponies PostgreSQL 8.3 –

+1

Vous devez utiliser une boucle - voir les exemples: http://www.linuxtopia.org/online_books/database_guides/Practical_PostgreSQL_database/PostgreSQL_x20238_002.htm –

Répondre

60

Je espère avoir compris ce que vous avez besoin (testé sur 8.2):

INSERT INTO articles (id, name) 
SELECT x.id, 'article #' || x.id 
    FROM generate_series(1,10000000) AS x(id); 
+0

Merci, j'ai dû ajouter une permission pour tous mes rôles, donc je l'ai fait: insert dans ROLE_PERM (ROLE_ID, PERMISSION_ID) \t sélectionnez ROLE_ID, 722 à partir de ROLE order by ROLE_ID; –

3

Autant que je sache, vous ne pouvez pas écrire une boucle directement en tant que SQL, vous auriez à créer un stored procedure pour le faire .

Cela fera bien (mais quelqu'un peut probablement rendre plus propre)

INSERT INTO articles WITH RECURSIVE i AS 
(
SELECT 1 x 
    UNION ALL 
SELECT x + 1 
    FROM i 
WHERE x < 10000000 
) 
SELECT x 
FROM i; 
+0

Le [récursif WITH is 8.4+] (http://www.postgresql.org/docs/8.4/static/queries-with.html), mais il n'y a [rien dans la documentation sur la prise en charge dans une instruction INSERT] (http : //www.postgresql.org/docs/9.0/static/sql-insert.html). Ce n'est pas nécessairement définitif ... –

+0

OP confirmé en utilisant v8.3, ne peut pas utiliser récursive AVEC :( –

15

Dans SQL Server, vous pouvez faire:

DECLARE @i int 
SET @i = 1 

WHILE @i<1000000 
    BEGIN 
     INSERT INTO articles 
     VALUES @i 
     SET @[email protected]+1 
    END 
+0

Quelqu'un comme OMGPonies peut nous dire si cela fonctionnera en postgre – JNK

+0

Mon pgPLSQL est faible, mais: http: // www. linuxtopia.org/online_books/database_guides/Practical_PostgreSQL_database/PostgreSQL_x20238_002.htm J'utiliserais le recursive WITH si possible (comme vous le voyez dans la réponse de nos), mais je n'ai pas d'instance à tester donc ça ressemble à une boucle (pour avant 8.4, au minimum) Mais avec PostgreSQL v9 en ajoutant des blocs pgPLSQL anonymes (enfin, non pris en charge par Oracle), c'est plus facile pour une utilisation de temps –

Questions connexes