2010-09-21 101 views
40

我正在使用Postgres,並且我有大量需要插入到數據庫中的行,這些行僅在遞增的整數方面有所不同。原諒可能是一個愚蠢的問題,但我不是一個數據庫大師。 是否可以直接輸入一個SQL查詢,該查詢將使用循環以編程方式插入行?如何使用SQL for循環將行插入數據庫?

例如在我想要做的僞代碼:

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

它有助於瞭解您正在使用的PostgreSQL版本。 – 2010-09-21 21:11:43

+0

@OMG Ponies PostgreSQL 8.3 – 2010-09-21 21:25:50

+1

您需要使用LOOP - 請參閱示例:http://www.linuxtopia.org/online_books/database_guides/Practical_PostgreSQL_database/PostgreSQL_x20238_002.htm – 2010-09-21 21:28:05

回答

60

希望我明白你需要(在8.2測試):

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

謝謝,我必須爲我的所有角色添加一個權限,所以我做了:插入到ROLE_PERM(ROLE_ID,PERMISSION_ID) \t從ROLE order按ROLE_ID選擇ROLE_ID,722; – 2014-10-07 11:13:05

3

據我所知,你不能寫一個循環直接作爲SQL,你必須創建一個stored procedure做。

這樣做雖然(但有人或許可以使它更清潔)

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

[遞歸WITH是8.4+](http://www.postgresql.org/docs/8.4/static/queries-with.html),但是[有關在INSERT語句中支持它的文檔中沒有任何內容](http ://www.postgresql.org/docs/9.0/static/sql-insert.html)。這不一定是確切的... – 2010-09-21 21:09:28

+0

OP確認使用v8.3,不能使用遞歸與:( – 2010-09-21 21:26:35

15

在SQL Server中,你可以這樣做:

DECLARE @i int 
SET @i = 1 

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

有人喜歡OMGPonies可以告訴我們這是否會在postgre – JNK 2010-09-21 20:27:38

+0

工作我的pgPLSQL是薄弱的,但:http:// www。 linuxtopia.org/online_books/database_guides/Practical_PostgreSQL_database/PostgreSQL_x20238_002.htm如果可能的話,我會使用遞歸WITH(就像你在nos的答案中看到的那樣),但我沒有一個實例來測試,所以它看起來像一個循環是必需的(至少在8.4之前),但在PostgreSQL v9中添加匿名pgPLSQL塊(最後,不知道Oracle支持多長時間),一次使用更容易 – 2010-09-21 21:13:33

相關問題