135 lines
3.3 KiB
PL/PgSQL
135 lines
3.3 KiB
PL/PgSQL
-- Генерация целочисленного значения в диапазоне
|
|
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);
|
|
|