PostgreSQL -- 如何使用外键约束生成随机数量的假数据行?

问题描述

注意:我尝试搜索解决此问题的其他问题和答案,但找不到真正符合我的问题并提供完整解决方案的问题和答案。

我正在尝试使用 SQL 生成随机的合成数据来测试我的数据库架构。虽然使用 random() 在 PostgreSQL 中生成一堆随机值很容易,但生成随机数据集来保留我期望看到的数据的约束和特征则不然。具体来说,我有以下表格:

CREATE TABLE suites(
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,name TEXT
);

INSERT INTO suites(name)
SELECT 'suite' || g FROM generate_series(1,50) g;

CREATE TABLE tests(
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,name TEXT
);

INSERT INTO tests(name)
SELECT 'test' || g FROM generate_series(1,100) g;

CREATE TABLE tests_in_suites(
suite_id BIGINT,test_id BIGINT,PRIMARY KEY (suite_id,test_id)
);

DB Fiddle

我想用随机值填充 tests_in_suites,这样每个套件都包含从 tests 统一选择的随机数(3 到 7 个)测试。我希望选择是随机和统一的,并避免循环和其他重复模式。我尝试了以下方法:

SELECT s.id,t.id FROM
(select id from suites) s,(SELECT id FROM tests ORDER BY random() LIMIT 2 + ceil(random() * 5)) t
ORDER BY s.id,t.id;

DB Fiddle

但它总是为每个套件选择相同数量的测试并且选择的测试是相同的,因为优化器将 s 的子查询替换为常量。我尝试引入对当前正在考虑的套件的依赖,但它抱怨无法访问我尝试使用的值:

SELECT s.id,(SELECT id FROM tests ORDER BY random() LIMIT 2 + ceil(random() * 5 + s.id*0)) t
ORDER BY s.id,t.id;

ERROR:  invalid reference to FROM-clause entry for table "s"
LINE 3: ...s ORDER BY random() LIMIT 2 + ceil(random() * 5 + s.id*0)) t
                                                             ^
HINT:  There is an entry for table "s",but it cannot be referenced from this part of the query.

DB Fiddle

如何生成随机数据而不会成为查询中优化器或无效数据依赖项的牺牲品?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)