custassets
和tags
。为了生成一些测试数据,我想在一个多对多的表中执行INSERT INTO
和SELECT
,以从每个表中获取随机行(这样来自一个表的随机主键将与第二个表的随机主键配对)。令我惊讶的是,这并不像我最初想的那么容易,所以我要坚持下去以便自我学习。这是我的第一次尝试。我选择10个
custassets
和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
....
接下来我尝试了以下方法:在SELECT
列列表中执行第二个RANDOM()
调用。然而,这种方法更糟糕,因为它选择一个单一的标签主键并坚持使用它。
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
来实现呢?
我曾考虑使用随机函数选择整数主键,但不幸的是,两个表的主键都存在增量序列中的空缺(因此可能会选择每个表中的空行)。否则这样做就没问题了!
:-)
- halfer