Browse Source

Добавил проверку на существование таблиц и стартовых значений

Vsevolod Levitan 2 months ago
parent
commit
be99472834
1 changed files with 32 additions and 7 deletions
  1. 32 7
      homework/1.sql

+ 32 - 7
homework/1.sql

@@ -1,15 +1,24 @@
-begin;
+DO $$ 
+begin
 
 -- Создаем таблицу званий
+if exists(select from pg_catalog.pg_tables where tablename = 'ranks') then
+raise notice 'Ranks table exists';
+else 
 create table ranks (id serial primary key, name varchar(32));
+end if;
 
 -- Создаем таблицу пользователей
-create table users (id serial primary key, name varchar(64), rank_id integer);
-
--- Привязываем users(rank_id) -> ranks(id)
-alter table users add foreign key(rank_id) references ranks(id);
+if exists(select from pg_catalog.pg_tables where tablename = 'users') then
+raise notice 'Users table exists';
+else
+create table users (id serial primary key, name varchar(64), rank_id integer references ranks(id));
+end if;
 
 -- Заполняем звания
+if exists(select from ranks where name = 'Рядовой') then
+raise notice 'Ranks values exist';
+else
 insert into ranks(name) values ('Рядовой');
 insert into ranks(name) values ('Ефрейтор');
 insert into ranks(name) values ('Младший сержант');
@@ -30,22 +39,38 @@ insert into ranks(name) values ('Генерал лейтенант');
 insert into ranks(name) values ('Генерал полковник');
 insert into ranks(name) values ('Генерал армии');
 insert into ranks(name) values ('Маршал России');
+end if;
 
 -- Обновляем username(varchar) -> user_id(integer) в measurement_batch
+if exists(select from information_schema.columns where table_name='measurement_batch' and column_name='user_id') then
+raise notice 'user_id column already exists in table measurement_batch';
+else
 alter table measurement_batch rename column username to user_id;
 alter table measurement_batch alter column user_id type integer using null;
+end if;
 
 -- Привязываем measurement_batch(user_id) -> users(id)
+if exists(select from information_schema.referential_constraints where constraint_name = 'measurement_batch_user_id_fkey') then
+raise notice 'Foreign key measurement_batch(user_id) -> users(id) exists';
+else
 alter table measurement_batch add foreign key(user_id) references users(id);
+end if;
 
 -- Заполняем тестовые данные:
 -- -- Пользователь
+if exists(select from users) then
+raise notice 'Test user exists';
+else
 insert into users(name, rank_id) values ('Левитан Всеволод Романович', (select id from ranks order by id desc limit 1));
+end if;
 -- -- Измерение
+if exists(select from measurement_batch) then
+raise notice 'Test batch exists';
+else
 insert into measurement_batch(start_period, user_id, pos_x, pos_y) values (now(), (select id from users limit 1), 69.00, 42.00);
+end if;
 
-commit;
-
+END$$;
 
 -- Проверяем
 select batch.id, batch.start_period, concat(rnk.name, ' ', usr.name), batch.pos_x, batch.pos_y from measurement_batch batch join users usr on batch.user_id = usr.id join ranks rnk on usr.rank_id = rnk.id;