Как можно вставить сразу много случайных данных разного типа в Postgresql

CREATE TABLE "user"
(
    id         BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
    first_name VARCHAR(255),
    last_name  VARCHAR(255),
    email      VARCHAR(255),
    password   VARCHAR(60),
    role       VARCHAR(255),
    enabled    BOOLEAN                                 NOT NULL DEFAULT FALSE,
    CONSTRAINT pk_user PRIMARY KEY (id)
);
INSERT INTO "user" (
                    first_name,
                    last_name,
                    email,
                    password,
                    role,
                    enabled)
VALUES (
        repeat(substr(gen_random_uuid()::text, 1, 10), 5),
        repeat(substr(gen_random_uuid()::text, 1, 10), 5),
        /*генерирует email*/
        repeat(substr(gen_random_uuid()::text, 2, 5 )
            || '@' ||
        substr(gen_random_uuid()::text, 2, 5)
            || '.com', 5),
        repeat(substr(gen_random_uuid()::text, 1, 10),5),
        /*каждый раз рандомно выбирает из предоставленного списка
          случайное значение*/
        repeat((array['ADMIN', 'MANAGER', 'USER'])[floor(random() * 3 + 1)], 5),
        repeat((array[true, false])[floor(random() * 2 + 1)], 5)
       );

Хочется сгенерировать сразу несколько строк.

generate_series() - не подойдет, ну по крайней мере я не смог его приспособить.

Функция repeat() работает для строк, но для остальных типов данных - не работает. Кто знает, как можно решить такую проблему ?


Ответы (1 шт):

Автор решения: skyho

Возможно вот так

INSERT INTO "user" (id,
                    first_name,
                    last_name,
                    email,
                    password,
                    role,
                    enabled)
VALUES (generate_series(1, 50),
       substr(gen_random_uuid()::text, 1, 10),
        substr(gen_random_uuid()::text, 1, 10),
        /*генерирует email*/
        substr(gen_random_uuid()::text, 2, 5 )
            || '@' ||
        substr(gen_random_uuid()::text, 2, 5)
            || '.com',
        substr(gen_random_uuid()::text, 1, 10),
        /*каждый раз рандомно выбирает из предоставленного списка
          случайное значение*/
        (array['ADMIN', 'MANAGER', 'USER'])[floor(random() * 3 + 1)],
        (array[true, false])[floor(random() * 2 + 1)]
       );

или так

INSERT INTO "user"
SELECT generate_series(1, 50),
       substr(gen_random_uuid()::text, 1, 10),
       substr(gen_random_uuid()::text, 1, 10),
       substr(gen_random_uuid()::text, 2, 5)
           || '@' ||
       substr(gen_random_uuid()::text, 2, 5)
           || '.com',
       substr(gen_random_uuid()::text, 1, 10),
       (array ['ADMIN', 'MANAGER', 'USER'])[floor(random() * 3 + 1)],
       (array [true, false])[floor(random() * 2 + 1)];

может кто предложит другое решение, если это по какой-то причине не очень подходит...

→ Ссылка