2010-09-21 143 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

相关问题