【问题标题】:How to use a SQL for loop to insert rows into database?如何使用 SQL for 循环将行插入数据库?
【发布时间】: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 上吗?

标签: sql postgresql


【解决方案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;

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-17
  • 2015-05-11
  • 2023-04-11
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多