Initial commit
This commit is contained in:
@@ -0,0 +1,134 @@
|
||||
-- Генерация целочисленного значения в диапазоне
|
||||
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);
|
||||
|
||||
Reference in New Issue
Block a user