Поэтому я пытаюсь пропустить создание фиктивных данных с помощью внешнего скрипта и вместо этого использовать generate_series() в PostgreSQL. Если я попробую меньше строк, в лучшем случае он вернется с сообщением «не удалось записать блок: временный файл журнала... недостаточно места на устройстве».
Код:
CREATE TABLE posts(
id INTEGER PRIMARY KEY,
author VARCHAR(20),
likes INTEGER,
content VARCHAR(200),
posted TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO posts
SELECT DISTINCT id, author, likes, content, posted FROM
generate_series(1,10000) AS id, substr(md5(random()::text), 0, 20) AS
author, generate_series(1,10000) AS likes, md5(random()::text) AS
content, generate_series('2007-02-01'::timestamp,
'2018-04-01'::timestamp, '1 hour') AS posted;
Несколько возможностей, о которых я мог подумать:
Как мне сгенерировать только 10000 строк? Я бы предположил, что generate_series() выполняет отдельные вызовы, которые добавляют все больше и больше строк или вызывают фактор ветвления.
Делая то, что вы делаете в предложении from, вы получаете декартово произведение всех созданных вами наборов. Если вы просто хотите сгенерировать 10000 строк, вам нужно что-то вроде следующего.
INSERT INTO posts
SELECT id, substr(md5(random()::text), 0, 20) AS author, (random() * 100)::integer AS likes,
md5(random()::text) AS content, '2007-02-01'::timestamp + (id * '1 hour'::interval) AS posted
FROM
generate_series(1,10000) AS id
Вы понимаете, что генерируете промежуточную сумму в 9 784 800 000 000 строк, прежде чем они будут различаться? Также я подозреваю, что вы не хотите, чтобы автор и контент были одинаковыми для всех строк?