我正在使用Postgres,并且我有大量需要插入到数据库中的行,这些行仅在递增的整数方面有所不同。原谅可能是一个愚蠢的问题,但我不是一个数据库大师。 是否可以直接输入一个SQL查询,该查询将使用循环以编程方式插入行?如何使用SQL for循环将行插入数据库?
例如在我想要做的伪代码:
for i in 1..10000000 LOOP
INSERT INTO articles VALUES(i)
end loop;
我正在使用Postgres,并且我有大量需要插入到数据库中的行,这些行仅在递增的整数方面有所不同。原谅可能是一个愚蠢的问题,但我不是一个数据库大师。 是否可以直接输入一个SQL查询,该查询将使用循环以编程方式插入行?如何使用SQL for循环将行插入数据库?
例如在我想要做的伪代码:
for i in 1..10000000 LOOP
INSERT INTO articles VALUES(i)
end loop;
希望我明白你需要(在8.2测试):
INSERT INTO articles (id, name)
SELECT x.id, 'article #' || x.id
FROM generate_series(1,10000000) AS x(id);
谢谢,我必须为我的所有角色添加一个权限,所以我做了:插入到ROLE_PERM(ROLE_ID,PERMISSION_ID) \t从ROLE order按ROLE_ID选择ROLE_ID,722; – 2014-10-07 11:13:05
据我所知,你不能写一个循环直接作为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;
[递归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
OP确认使用v8.3,不能使用递归与:( – 2010-09-21 21:26:35
在SQL Server中,你可以这样做:
DECLARE @i int
SET @i = 1
WHILE @i<1000000
BEGIN
INSERT INTO articles
VALUES @i
SET @[email protected]+1
END
有人喜欢OMGPonies可以告诉我们这是否会在postgre – JNK 2010-09-21 20:27:38
工作我的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
它有助于了解您正在使用的PostgreSQL版本。 – 2010-09-21 21:11:43
@OMG Ponies PostgreSQL 8.3 – 2010-09-21 21:25:50
您需要使用LOOP - 请参阅示例:http://www.linuxtopia.org/online_books/database_guides/Practical_PostgreSQL_database/PostgreSQL_x20238_002.htm – 2010-09-21 21:28:05