如何使用 SQL for 循环将行插入数据库?
Posted
技术标签:
【中文标题】如何使用 SQL for 循环将行插入数据库?【英文标题】:How to use a SQL for loop to insert rows into database? 【发布时间】:2010-09-21 20:02:35 【问题描述】:我正在使用 Postgres,并且我有大量的行需要插入到数据库中,它们的区别仅在于递增的整数。原谅可能是一个愚蠢的问题,但我不是数据库专家。 是否可以直接输入将使用循环以编程方式插入行的 SQL 查询?
我正在尝试做的伪代码示例:
for i in 1..10000000 LOOP
INSERT INTO articles VALUES(i)
end loop;
【问题讨论】:
了解您使用的 PostgreSQL 版本会有所帮助。 您需要使用 LOOP - 请参阅示例:linuxtopia.org/online_books/database_guides/… @OMG Ponies 非常感谢您的意见。我认为您无法就我需要的语法的一般概念提供任何指示?在发布此之前,我最初正在查看循环文档,这就是我最终得到我在上面编写的那个伪代码的方式,但我似乎无法将它变成 Postgres 似乎可以理解的任何形式。 @William Jones:该链接提供 PostgreSQL 语法 - 您的 FOR 循环语法是相同的。 另外,使用 shell 和 psql 命令行工具这样做很简单(尽管效率不高)。你在 *nix 上吗? 【参考方案1】:希望我已经了解您的需求(在 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) select ROLE_ID, 722 from ROLE order by ROLE_ID;【参考方案2】:在 SQL Server 中你可以这样做:
DECLARE @i int
SET @i = 1
WHILE @i<1000000
BEGIN
INSERT INTO articles
VALUES @i
SET @i=@i+1
END
【讨论】:
像 OMGPonies 这样的人可以告诉我们这是否适用于 postgre 我的 pgPLSQL 很弱,但是:linuxtopia.org/online_books/database_guides/… 如果可能的话,我会使用递归 WITH(就像你在 nos 的答案中看到的那样),但我没有要测试的实例,所以看起来需要一个循环(至少在 8.4 之前)。但随着 PostgreSQL v9 添加匿名 pgPLSQL 块(最后,不知道 Oracle 支持多长时间),一次性使用更容易。【参考方案3】:Afaik,您不能直接将循环编写为 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;
【讨论】:
recursive WITH is 8.4+,但有nothing in the documentation about supporting it in an INSERT statement。这不一定是确定的...... OP 使用 v8.3 确认,不能使用递归 WITH :(以上是关于如何使用 SQL for 循环将行插入数据库?的主要内容,如果未能解决你的问题,请参考以下文章