PostgreSQL:有没有办法克隆一行数据,以便用测试数据填充 table?

PostgreSQL: Is there a way to clone a row of data in order to populate a table with test data?

我正在寻找一种快速填充 table 充满约束和复杂性的方法,以便基本上将两行克隆一千次以上,以便有 1000 多行的基础进行测试。

我理解基本结构应该是这样的:

INSERT INTO footbl( 
   foo1, foo2, foo3
)
SELECT foo,
       foo1,
       foo3
FROM footbl WHERE id=1;

我如何接受这个语句并让它重复一千次?

编辑:

在尝试 generate_series 解决方案时 -

INSERT INTO footbl(foo1, foo2, foo3)
    SELECT foo, foo1, foo3
    FROM footbl CROSS JOIN
         generate_series(1, 1000)
    WHERE pk = 1;

我收到以下错误。

ERROR: duplicate key value violates unique constraint "pk" 
DETAIL: Key (pk)=(1) already exists.  

我尝试使用 pk 的下一个值,但它没有插入任何内容。

INSERT 0 0 

从列出的列中删除 pk 以允许它完全自动生成会给出错误,即列 "pk" 中的空值违反了非空约束。查看 "pk" 的 table 定义:

pk | bigint | not null | plain 

评论中还提供了一些进一步的说明,该数据库是从客户端提取的骨架数据库。我引入了 just 模式和全局定义,以及 2 行数据。由于复杂的原因,我无法返回他们的数据库以导出 1000 行数据,因此我希望专门克隆 2 个现有行中的 1 个,1000 次。这也意味着我最好不要修改现有的约束、修饰符等任何东西,并保持架构原样,以便对这个克隆的数据库进行准确的测试。

第二次编辑:

由于时间不够,我继续修改架构如下:

CREATE SEQUENCE foo_id_seq;
ALTER TABLE foo ALTER COLUMN pk SET DEFAULT nextval('temp_id_seq');

这解决了我的 PK 冲突问题并允许生成行。但是,如果有人对如何在不修改架构 的情况下 实现同样的事情有任何想法,请在下面发表评论并告诉我。谢谢!

您可以使用 generate_series():

INSERT INTO footbl(foo1, foo2, foo3)
    SELECT foo, foo1, foo3
    FROM footbl CROSS JOIN
         generate_series(1, 1000)
    WHERE id = 1;