Сначала создадим новую БД 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
После этого можно занести результаты десятиклассникам: