2010-09-21 36 views
40

Używam PostgreSQL i mam dużą liczbę wierszy, które należy wstawić do bazy danych, które różnią się tylko liczbą całkowitą, która jest zwiększana. Wybacz to głupie pytanie, ale nie jestem guru bazy danych. Czy można bezpośrednio wprowadzić zapytanie SQL, które będzie używać pętli do programowego wstawiania wierszy?Jak używać pętli SQL do wstawiania wierszy do bazy danych?

przykład w pseudo-kodzie, co usiłuję zrobić:

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

Pomoże to sprawdzić, jakiej wersji PostgreSQL używasz. –

+0

@OMG Kucyki PostgreSQL 8.3 –

+1

Musisz użyć LOOP - patrz przykłady: http://www.linuxtopia.org/online_books/database_guides/Practical_PostgreSQL_database/PostgreSQL_x20238_002.htm –

Odpowiedz

60

Mam nadzieję, że mam rozumieć to, czego potrzebujesz (testowane na 8,2):

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

Dzięki. Musiałem dodać pozwolenie dla wszystkich moich ról, więc zrobiłem: wstaw do ROLE_PERM (ROLE_ID, PERMISSION_ID) \t wybierz ROLE_ID, 722 z ROLE zamówienia przez ROLE_ID; –

3

AFAIK, nie można napisać pętlę bezpośrednio jako SQL, trzeba by stworzyć stored procedure to zrobić .

to zrobi choć (ale prawdopodobnie ktoś może zrobić to czystsze)

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

[rekurencyjny WITH ma 8.4+] (http://www.postgresql.org/docs/8.4/static/queries-with.html), ale nie ma [nic w dokumentacji o obsłudze tego w instrukcji INSERT] (http : //www.postgresql.org/docs/9.0/static/sql-insert.html). To niekoniecznie definitywne ... –

+0

OP potwierdzone za pomocą v8.3, nie może używać rekurencji Z :( –

15

W SQL Server można zrobić:

DECLARE @i int 
SET @i = 1 

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

Ktoś taki jak OMGPonies może nam powiedzieć, czy to zadziała w postgre – JNK

+0

Mój pgPLSQL jest słaby, ale: http: // www. linuxtopia.org/online_books/database_guides/Practical_PostgreSQL_database/PostgreSQL_x20238_002.htm Używałbym rekurencji Z, jeśli to możliwe (jak widzisz w "odpowiedzi"), ale nie mam instancji do testowania, więc wygląda na to, że wymagana jest pętla (dla minimum do 8,4), ale z PostgreSQL v9 dodając anonimowe bloki pgPLSQL (ostatecznie, nie wiem jak długo Oracle obsługuje), to jest łatwiejsze do jednorazowego użycia. –

Powiązane problemy