2010-09-21 7 views
40

Sto utilizzando Postgres e ho un numero elevato di righe che devono essere inserite nel database, che differiscono solo in termini di un numero intero che viene incrementato. Perdona quella che potrebbe essere una domanda sciocca, ma io non sono un guru del database. È possibile inserire direttamente una query SQL che utilizzerà un ciclo per inserire le righe in modo programmatico?Come utilizzare un SQL for loop per inserire le righe nel database?

Esempio in pseudo-codice di quello che sto cercando di fare:

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

Sarebbe utile sapere quale versione di PostgreSQL stai usando. –

+0

@OMG Ponies PostgreSQL 8.3 –

+1

È necessario utilizzare un LOOP - vedere gli esempi: http://www.linuxtopia.org/online_books/database_guides/Practical_PostgreSQL_database/PostgreSQL_x20238_002.htm –

risposta

60

Spero di aver capito che cosa avete bisogno (testato su 8.2):

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

Grazie. Ho dovuto aggiungere un'autorizzazione per tutti i miei ruoli, così ho fatto: inserire in ROLE_PERM (ROLE_ID, PERMISSION_ID) \t selezionare ROLE_ID, 722 dall'ordine ROLE di ROLE_ID; –

3

AFAIK, non è possibile scrivere un ciclo direttamente come SQL, dovreste creare un stored procedure per farlo .

Questo farà anche se (ma qualcuno probabilmente può rendere più pulita)

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

Il [ricorsivo WITH è 8.4+] (http://www.postgresql.org/docs/8.4/static/queries-with.html), ma non c'è [niente nella documentazione sul supporto in una dichiarazione INSERT] (http : //www.postgresql.org/docs/9.0/static/sql-insert.html). Non è necessariamente definitivo ... –

+0

OP confermato usando la v8.3, non è possibile utilizzare ricorsivo CON :( –

15

In SQL Server si può fare:

DECLARE @i int 
SET @i = 1 

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

Qualcuno come OMGPonies può dirci se questo funzionerà in Postgre – JNK

+0

Il mio pgPLSQL è debole, ma: http: // www. linuxtopia.org/online_books/database_guides/Practical_PostgreSQL_database/PostgreSQL_x20238_002.htm Userei il ricusivo WITH se possibile (come si vede nella risposta di nos), ma non ho un'istanza da testare quindi sembra che sia richiesto un ciclo (per le versioni precedenti alla 8.4, come minimo), ma con PostgreSQL v9 che aggiunge blocchi pgPLSQL anonimi (finalmente, non so per quanto tempo è supportato da Oracle), è più facile da usare 1. –

Problemi correlati