Глава 24. Заполнение БД «Олимпиады»

Сначала создадим новую БД olymp:

[tz@coneforest ~/work/54/doc/inf/databases]% createdb olymp
CREATE DATABASE

Начнём заполнение БД с создания и заполнения самой простой таблицы subject. Но прежде заметим, что ни поле id, ни name не должны быть пустыми. Запретить принимать им значение NULL можно, указав в описании поля после имени типа NOT NULL:

olymp=# CREATE TABLE subject
olymp-# (id CHARACTER NOT NULL UNIQUE, name TEXT NOT NULL CHECK (name!=''));
NOTICE:  CREATE TABLE / UNIQUE создаст подразумеваемый индекс "subject_id_key"
для таблицы "subject"
CREATE TABLE
olymp=# INSERT INTO subject VALUES
olymp-# ('R', 'русский язык и литература'),
olymp-# ('M', 'математика'),
olymp-# ('P', 'физика'),
olymp-# ('C', 'химия'),
olymp-# ('I', 'информатика'),
olymp-# ('A', 'астрономия');
INSERT 0 6
olymp=# SELECT * FROM subject;
 id |           name            
----+---------------------------
 R  | русский язык и литература
 M  | математика
 P  | физика
 C  | химия
 I  | информатика
 A  | астрономия
(6 rows)

Теперь займёмся школьниками:

olymp=# CREATE TABLE pupil
olymp-# (
olymp(# id SERIAL UNIQUE,
olymp(# name TEXT NOT NULL CHECK (name!=''),
olymp(# school TEXT NOT NULL CHECK (school!=''),
olymp(# graduate INTEGER CHECK (graduate>2000 AND graduate<=2100)
olymp(# );
NOTICE:  CREATE TABLE создаст подразумеваемую последовательность "pupil_id_seq"
для serial-колонки "pupil.id"
NOTICE:  CREATE TABLE / UNIQUE создаст подразумеваемый индекс "pupil_id_key"
для таблицы "pupil"
CREATE TABLE
olymp=# INSERT INTO pupil (name, school, graduate) VALUES
olymp-# ('Розенталь Дитмар', '1', 2011),
olymp-# ('Теленкова Маргарита', '1', 2011),
olymp-# ('Менделеев Дмитрий', '11', 2010),
olymp-# ('Лебедев Александр', '18', 2009),
olymp-# ('Ландау Лев', '18', 2011),
olymp-# ('Боголюбов Николай', '18', 2011),
olymp-# ('Понтрягин Лев', '2', 2011),
olymp-# ('Колмогоров Андрей', '2', 2011),
olymp-# ('Арнольд Владимир', '2', 2012),
olymp-# ('Щёголев Павел', '1', 2011),
olymp-# ('Седов Леонид', '2', 2011),
olymp-# ('Касперский Евгений', '8', 2012),
olymp-# ('Пажитнов Алексей', '8', 2012),
olymp-# ('Лозинский Дмитрий', '8', 2012),
olymp-# ('Лотман Юрий', '1', 2011),
olymp-# ('Ожегов Сергей', '1', 2011),
olymp-# ('Шведова Наталия', '1', 2011),
olymp-# ('Ушаков Дмитрий', '1', 2011),
olymp-# ('Зинин Николай', '11', 2010),
olymp-# ('Бутлеров Александр', '11', 2010),
olymp-# ('Гельфанд Израиль', '2', 2011),
olymp-# ('Циолковский Эдуард', '18', 2010),
olymp-# ('Бородин Александр', '11', 2009),
olymp-# ('Ловиц Товий', '11', 2009),
olymp-# ('Ловиц Егор', '14', 2008),
olymp-# ('Эйлер Леонард', '2', 2008);
INSERT 0 26
olymp=# SELECT * FROM pupil;
 id |        name         | school | graduate 
----+---------------------+--------+----------
  1 | Розенталь Дитмар    | 1      |     2011
  2 | Теленкова Маргарита | 1      |     2011
  3 | Менделеев Дмитрий   | 11     |     2010
  4 | Лебедев Александр   | 18     |     2009
  5 | Ландау Лев          | 18     |     2011
  6 | Боголюбов Николай   | 18     |     2011
  7 | Понтрягин Лев       | 2      |     2011
  8 | Колмогоров Андрей   | 2      |     2011
  9 | Арнольд Владимир    | 2      |     2012
 10 | Щёголев Павел       | 1      |     2011
 11 | Седов Леонид        | 2      |     2011
 12 | Касперский Евгений  | 8      |     2012
 13 | Пажитнов Алексей    | 8      |     2012
 14 | Лозинский Дмитрий   | 8      |     2012
 15 | Лотман Юрий         | 1      |     2011
 16 | Ожегов Сергей       | 1      |     2011
 17 | Шведова Наталия     | 1      |     2011
 18 | Ушаков Дмитрий      | 1      |     2011
 19 | Зинин Николай       | 11     |     2010
 20 | Бутлеров Александр  | 11     |     2010
 21 | Гельфанд Израиль    | 2      |     2011
 22 | Циолковский Эдуард  | 18     |     2010
 23 | Бородин Александр   | 11     |     2009
 24 | Ловиц Товий         | 11     |     2009
 25 | Ловиц Егор          | 14     |     2008
 26 | Эйлер Леонард       | 2      |     2008
(26 rows)

Видно, что поле id оказалось заполнено без каких-либо усилий с нашей стороны.

olymp=# CREATE TABLE olymp
olymp-# (
olymp(# id SERIAL UNIQUE,
olymp(# date DATE,
olymp(# subject_id CHARACTER REFERENCES subject (id),
olymp(# class INTEGER CHECK (class>0 AND class<=11),
olymp(# result_max INTEGER CHECK (result_max>=0)
olymp(# );
NOTICE:  CREATE TABLE создаст подразумеваемую последовательность "olymp_id_seq"
для serial-колонки "olymp.id"
NOTICE:  CREATE TABLE / UNIQUE создаст подразумеваемый индекс "olymp_id_key"
для таблицы "olymp"
CREATE TABLE

Теперь опишем олимпиаду по русскому языку и литературе для 10 класса, проходившей 2010-02-27 (максимальный балл — 100):

olymp=# INSERT INTO olymp (date, subject_id, class, result_max) VALUES
olymp-# ('2010-02-27', 'R', 10, 100);
INSERT 0 1

После этого можно занести результаты десятиклассникам:

Информатика-54