我正在寻找一种快速方法来填充充满约束和复杂性的表,以基本上克隆两行超过一千次,以便有 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”的表定义:
pk | bigint | not null | plain
评论中还提供了一些进一步的说明,该数据库是从客户端拉取的骨架数据库。我仅引入了架构和全局定义以及 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;
关于database - PostgreSQL:有没有办法克隆一行数据以便用测试数据填充表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46576265/