У меня есть две таблицы, custassets
и теги
. Чтобы сгенерировать некоторые тестовые данные, я хотел бы выполнить INSERT INTO
таблицу «многие ко многим» с SELECT
. ], который получает случайные строки из каждой (так что случайный первичный ключ из одной таблицы сочетается со случайным первичным ключом из второй). К моему удивлению, это не так просто, как я сначала думал, поэтому я настаиваю на этом
Вот моя первая попытка. Я выбираю 10 custassets
и 3 тега
, но оба одинаковы в каждом случае. Мне подойдет первая таблица исправлено, но я хотел бы рандомизировать назначенные теги.
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
. Однако этот был хуже, так как le tag 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
?
Я думал о выборе целочисленных первичных ключей с помощью случайной функции, но, к сожалению, первичные ключи для обеих таблиц имеют пробелы в последовательностях приращения (поэтому в каждой таблице может быть выбрана пустая строка).Иначе было бы хорошо!