Страницы

Поиск по вопросам

понедельник, 8 июля 2019 г.

Заполнить базу данных данными

Есть три таблицы
CREATE TABLE students( stId SERIAL PRIMARY KEY, firstName VARCHAR(64), secondName VARCHAR(64), middleName VARCHAR(64));
CREATE TABLE subjects( sbId SERIAL PRIMARY KEY, title VARCHAR(64));
CREATE TABLE assessments( assId SERIAL PRIMARY KEY, valuation VARCHAR(64), stId INTEGER REFERENCES students, sbId INTEGER REFERENCES subjects);
Какие есть способы автоматического заполнения таблиц при помощи PL\pgSQL? Есть ли способ сгенерировать случайне данные(возможно "осмысленные") для таблицы students и subjects?


Ответ

Вот мое решение. может кому-то пригодится.
INSERT INTO subjects (title) VALUES ('Алгебра'), ('Геометрия'), ('Физика'), ('Экономика'), ('Английский'), ('Религия'), ('История'), ('ПТЦА'), ('Радиоматериалы'), ('Программирование'), ('Метрология'), ('Теория цепей'), ('Компьютерная графика'), ('Цифровые утсройства'), ('Философия'), ('Основы права'), ('Механика'), ('Радиоавтоматика'), ('Социология'), ('Политология');
CREATE OR REPLACE FUNCTION make_random_students() RETURNS int AS $$ DECLARE r record; studentsCount int; names VARCHAR[]; secondnames VARCHAR[]; middlenames VARCHAR[]; arr_names_length int; arr_secondnames_length int; arr_middlenames_length int; BEGIN studentsCount := 0; names := ARRAY['Сергей', 'Антон', 'Михаил', 'Степан', 'Семен', 'Николай', 'Василий', 'Виктор', 'Геннадий', 'Александр', 'Владимир', 'Денис', 'Дмитрий', 'Алексей', 'Константин', 'Евгений', 'Борис', 'Виталий', 'Станислав', 'Анатолий']; secondnames := ARRAY['Сергеев', 'Антонов', 'Михаилов', 'Степанов', 'Семенов', 'Николаевский', 'Васильев', 'Викторов', 'Геннадиев', 'Александров', 'Владимирский', 'Денисов', 'Дмитриев', 'Алексеев', 'Константинов', 'Евгениев', 'Борисов', 'Витальев', 'Станиславский', 'Анатольев']; middlenames := ARRAY['Сергевич', 'Антонович', 'Михаилович', 'Степанович', 'Семенович', 'Николаевич', 'Васильевич', 'Викторович', 'Геннадьевич', 'Александрович', 'Владимирович', 'Денисович', 'Дмитриевич', 'Алексеевич', 'Константинович', 'Евгениевич', 'Борисович', 'Витальевич', 'Станиславович', 'Анатольевич']; arr_names_length := array_length(names, 1); arr_secondnames_length := array_length(secondnames, 1); arr_middlenames_length := array_length(middlenames, 1); FOR i IN 1..50000 LOOP INSERT INTO students (firstName, secondName, middleName) VALUES (names[trunc(random()*arr_names_length)+1], secondnames[trunc(random()*arr_secondnames_length)+1], middlenames[trunc(random()*arr_middlenames_length)+1]); studentsCount := studentsCount+1; END LOOP; RETURN studentsCount; END; $$ LANGUAGE plpgsql;
SELECT make_random_students();
CREATE OR REPLACE FUNCTION make_random_assessments() RETURNS int AS $$ DECLARE student record; subject record; assessmentCount int; BEGIN assessmentCount := 0; FOR student IN SELECT * FROM students LOOP FOR subject IN SELECT * FROM subjects LOOP INSERT INTO assessments (valuation, stId, sbId) VALUES (trunc(random()*5)+1, student.stID, subject.sbID); assessmentCount := assessmentCount+1; END LOOP; END LOOP; RETURN assessmentCount; END; $$ LANGUAGE plpgsql;
SELECT make_random_assessments();

Комментариев нет:

Отправить комментарий