我有两张桌子,custassets
和tags
。为了生成一些测试数据,我想做INSERT INTO
一个多对多表,其中 aSELECT
从每个表中获取随机行(以便一个表中的随机主键与第二个表中的随机主键配对)。令我惊讶的是,这并不像我最初想象的那么容易,所以我坚持用它来自学。
这是我的第一次尝试。我选择 10custassets
和 3 tags
,但在每种情况下都相同。我会很好地修复第一个表,但我想随机分配分配的标签。
SELECT
custassets_rand.id custassets_id,
tags_rand.id tags_rand_id
FROM
(
SELECT id FROM custassets WHERE defunct = false ORDER BY RANDOM() LIMIT 10
) AS custassets_rand
,
(
SELECT id FROM tags WHERE defunct = false ORDER BY RANDOM() LIMIT 3
) AS tags_rand
这会产生:
custassets_id | tags_rand_id
---------------+--------------
9849 | 3322 }
9849 | 4871 } this pattern of tag PKs is repeated
9849 | 5188 }
12145 | 3322
12145 | 4871
12145 | 5188
17837 | 3322
17837 | 4871
17837 | 5188
....
然后我尝试了以下方法:在列列表中进行第二次RANDOM()
调用。SELECT
然而这个更糟糕,因为它选择了一个标签 PK 并坚持下去。
SELECT
custassets_rand.id custassets_id,
(SELECT id FROM tags WHERE defunct = false ORDER BY RANDOM() LIMIT 1) tags_rand_id
FROM
(
SELECT id FROM custassets WHERE defunct = false ORDER BY RANDOM() LIMIT 30
) AS custassets_rand
结果:
custassets_id | tags_rand_id
---------------+--------------
16694 | 1537
14204 | 1537
23823 | 1537
34799 | 1537
36388 | 1537
....
这在脚本语言中很容易,而且我确信使用存储过程或临时表可以很容易地完成。但是我可以只用一个INSERT INTO SELECT
吗?
我确实考虑过使用随机函数选择整数主键,但不幸的是,两个表的主键在增量序列中都有间隙(因此可能在每个表中选择一个空行)。不然就好了!