Files
medical-monitoring-system/migrations/insert_persons.sql
T

135 lines
3.3 KiB
PL/PgSQL
Raw Normal View History

2026-07-12 15:08:43 +04:00
-- Генерация целочисленного значения в диапазоне
CREATE OR REPLACE FUNCTION random_int (min_val int, max_val int)
RETURNS int
AS $$
BEGIN
RETURN min_val + trunc(random() * (max_val - min_val + 1))::int;
END;
$$
LANGUAGE plpgsql
VOLATILE;
-- Генерация даты рождения в диапазоне
CREATE OR REPLACE FUNCTION random_date ()
RETURNS date
AS $$
DECLARE
from_date date := '1950-01-01';
to_date date := '2010-12-31';
BEGIN
RETURN from_date + random_int (0, to_date - from_date);
END;
$$
LANGUAGE plpgsql
VOLATILE;
-- Генерация адреса проживания
CREATE OR REPLACE FUNCTION random_address (street text)
RETURNS text
AS $$
BEGIN
RETURN street || ', дом ' || random_int (1, 40) || ', квартира ' || random_int (40, 120);
END;
$$
LANGUAGE plpgsql
VOLATILE;
-- --- Подготовленные общие данные ---
CREATE TEMP TABLE streets (
street text
);
\copy streets FROM 'csv/streets.csv' (FORMAT csv);
-- --- Подготовленные данные для генерации мужских записей ---
CREATE TEMP TABLE male_last_names (
last_name text
);
\copy male_last_names FROM 'csv/male_last_names.csv' (FORMAT csv);
CREATE TEMP TABLE male_first_names (
first_name text
);
\copy male_first_names FROM 'csv/male_first_names.csv' (FORMAT csv);
CREATE TEMP TABLE male_middle_names (
middle_name text
);
\copy male_middle_names FROM 'csv/male_middle_names.csv' (FORMAT csv);
-- Подготовленные данные для генерации женских записей
CREATE TEMP TABLE female_last_names (
last_name text
);
\copy female_last_names FROM 'csv/female_last_names.csv' (FORMAT csv);
CREATE TEMP TABLE female_first_names (
first_name text
);
\copy female_first_names FROM 'csv/female_first_names.csv' (FORMAT csv);
CREATE TEMP TABLE female_middle_names (
middle_name text
);
\copy female_middle_names FROM 'csv/female_middle_names.csv' (FORMAT csv);
-- Генерация --
-- Удаление старых данных
TRUNCATE TABLE persons RESTART IDENTITY CASCADE;
-- Генерация записей
INSERT INTO persons (last_name, first_name, middle_name, birth_date, gender, address)
SELECT
last_name,
first_name,
middle_name,
random_date (),
gender_enum,
random_address (street)
FROM (
-- Мужские записи
SELECT
ml.last_name,
mf.first_name,
mm.middle_name,
'male'::gender_enum,
s.street
FROM
male_last_names ml
CROSS JOIN male_first_names mf
CROSS JOIN male_middle_names mm
CROSS JOIN streets s
UNION ALL
-- Женские записи
SELECT
fl.last_name,
ff.first_name,
fm.middle_name,
'female'::gender_enum,
s.street
FROM
female_last_names fl
CROSS JOIN female_first_names ff
CROSS JOIN female_middle_names fm
CROSS JOIN streets s) all_people
ORDER BY
random();
DROP TABLE IF EXISTS streets;
DROP TABLE IF EXISTS male_last_names;
DROP TABLE IF EXISTS male_first_names;
DROP TABLE IF EXISTS male_middle_names;
DROP TABLE IF EXISTS female_last_names;
DROP TABLE IF EXISTS female_first_names;
DROP TABLE IF EXISTS female_middle_names;
DROP FUNCTION IF EXISTS random_date ();
DROP FUNCTION IF EXISTS random_address (TEXT);