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

标签 database postgresql generate-series

我正在寻找一种快速方法来填充充满约束和复杂性的表,以基本上克隆两行超过一千次,以便有 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/

相关文章:

ruby-on-rails - 在没有数据库的情况下将数据存储在 Ruby on Rails 中

sql - 计算不包括周末和节假日的日期之间的天数的初学者方法

sql - 如何在 postgresql 中生成直到当年的动态年份列表?

sql - 如何在 Postgres 中获取过去 12 周的发票数量

sql - 从日期范围创建日期和小时列

mysql - 用于跟踪和分摊费用的数据库设计

mysql - 在 SQL 中使用 SET 进行 INSERT INTO

mysql - Mysql 中的数据库排序规则和字符集设置(在 Laravel 中)

postgresql - Postgres 集群 : password authentication failed for user “postgres”

sql - 将字符字段更改为日期