我正在尝试使用虚拟数据生成虚拟表,以测试某些 SQL 任务的性能。
基于这个旧线程:有没有办法将多行插入到所有列都有默认值的表中?
我注意到,对于类型IDENTITY
,不再可能使用建议的generate_series(1, N)
解决方案用虚拟数据填充表。
那么,如何将 1'000 个虚拟数据插入到下表 (PG 14) 中,从而利用字段的默认值name
而不覆盖字段的系统值id
:
CREATE TABLE foo (
id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
name TEXT DEFAULT md5(random()::text)
);
Run Code Online (Sandbox Code Playgroud)
尝试以下操作失败:
INSERT INTO foo (id)
SELECT generate_series(1, 1000);
-- which results in:
ERROR: cannot insert a non-DEFAULT value into column "id"
DETAIL: Column "id" is an identity column defined as GENERATED ALWAYS.
HINT: Use OVERRIDING SYSTEM VALUE to override.
SQL state: 428C9 …
Run Code Online (Sandbox Code Playgroud)