2010-09-21 42 views
40

Estoy usando Postgres, y tengo una gran cantidad de filas que deben insertarse en la base de datos, que difieren solo en términos de un número entero que se incrementa. Perdonar lo que puede ser una pregunta tonta, pero no soy un gran gurú de la base de datos. ¿Es posible ingresar directamente una consulta SQL que usará un bucle para insertar las filas mediante programación?¿Cómo usar un bucle de SQL para insertar filas en la base de datos?

Ejemplo de pseudo-código de lo que estoy tratando de hacer:

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

Ayudaría saber qué versión de PostgreSQL está utilizando. –

+0

@OMG Ponies PostgreSQL 8.3 –

+1

Necesita usar un LOOP - vea los ejemplos: http://www.linuxtopia.org/online_books/database_guides/Practical_PostgreSQL_database/PostgreSQL_x20238_002.htm –

Respuesta

60

suerte he entendido lo que necesita (a prueba en 8.2):

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

Gracias. Tuve que agregar un permiso para todos mis roles, así que lo hice: insertar en ROLE_PERM (ROLE_ID, PERMISSION_ID) \t seleccionar ROLE_ID, 722 de ROLE pedido por ROLE_ID; –

3

Que yo sepa, no se puede escribir un bucle directamente como SQL, habría que crear un stored procedure hacerlo .

Esto va a hacer, aunque (pero probablemente alguien puede hacerlo más limpio)

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

El [recursivo WITH es 8.4+] (http://www.postgresql.org/docs/8.4/static/queries-with.html), pero no hay [nada en la documentación sobre cómo apoyarlo en una declaración INSERT] (http : //www.postgresql.org/docs/9.0/static/sql-insert.html). Eso no es necesariamente definitivo ... –

+0

OP confirmado usando v8.3, no puede usar recursivo WITH :( –

15

En SQL Server que puede hacer:

DECLARE @i int 
SET @i = 1 

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

Alguien como OMGPonies puede decirnos si esto funcionará en postgre – JNK

+0

Mi pgPLSQL es débil, pero: http: // www. linuxtopia.org/online_books/database_guides/Practical_PostgreSQL_database/PostgreSQL_x20238_002.htm Usaría el recursivo WITH si fuera posible (como se ve en la respuesta de nos), pero no tengo una instancia para probar, así que parece que se requiere un ciclo (para antes de 8.4, como mínimo). Pero con PostgreSQL v9 agregando bloques pgPLSQL anónimos (finalmente, no sé cuánto tiempo apoyó Oracle), es más fácil usarlo una sola vez. –

Cuestiones relacionadas