Skip to content

Commit dc4ef9f

Browse files
committed
add: 2.1 lectures, tasks
1 parent e0e8c46 commit dc4ef9f

File tree

5 files changed

+186
-0
lines changed

5 files changed

+186
-0
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
## Создание таблицы с внешними ключами
2+
3+
При создании зависимой таблицы (таблицы, которая содержит внешние ключи) необходимо учитывать, что :
4+
5+
- каждый внешний ключ должен иметь такой же тип данных, как связанное поле главной таблицы
6+
(в наших примерах это INT);
7+
- необходимо указать главную для нее таблицу и столбец, по которому осуществляется связь
8+
9+
```sql
10+
FOREIGN KEY (связанное_поле_зависимой_таблицы)
11+
REFERENCES главная_таблица (связанное_поле_главной_таблицы)
12+
```
13+
14+
По умолчанию любой столбец, кроме ключевого, может содержать значение NULL. При создании таблицы это можно переопределить, используя ограничение NOT NULL для этого столбца:
15+
```sql
16+
CREATE TABLE таблица(
17+
столбец_1 INT NOT NULL,
18+
столбец_2 VARCHAR(10)
19+
);
20+
```
21+
В созданной таблице в столбец_1 не может содержать пустое значение, а столбец_2 - может.
22+
Для внешних ключей рекомендуется устанавливать ограничение NOT NULL (если это совместимо с другими опциями, которые будут рассмотрены в следующем шаге).
23+
24+
**Пример 1.** Создать таблицу book следующей структуры:
25+
```
26+
Поле Тип, описание Связи
27+
28+
book_id Целое число, первичный ключ, автоматическое значение
29+
title Символьная строка в 50 знаков
30+
author_id Целое число, внешний ключ:
31+
главная таблица author;
32+
связанный столбец author.author_id;
33+
пустое значение не допускается.
34+
price Число с плавающей точкой (точность в 2 знака)
35+
amount Целое число
36+
```
37+
Запрос:
38+
```sql
39+
CREATE TABLE book (
40+
book_id INT PRIMARY KEY AUTO_INCREMENT,
41+
title VARCHAR(50),
42+
author_id INT NOT NULL,
43+
price DECIMAL(8,2),
44+
amount INT,
45+
FOREIGN KEY (author_id) REFERENCES author (author_id)
46+
);
47+
```
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
## Связь «многие ко многим»
2+
3+
На предыдущем шаге мы реализовали связь «один ко многим» для книг и авторов. Она означает, что каждый автор написал несколько книг, но каждую книгу написал только один автор. На самом деле, это не совсем верное утверждение. Например, книга «12 стульев» написана двумя авторами Ильфом И.А. и Петровым Е.П. С другой стороны, эти авторы написали и другие книги, например «Золотой теленок».
4+
5+
Для соединения таких таблиц используется связь «многие ко многим».
6+
7+
Связь «многие ко многим» имеет место когда каждой записи одной таблицы соответствует несколько записей во второй, и наоборот, каждой записи второй таблицы соответствует несколько записей в первой.
8+
9+
### Этапы реализации связи «многие ко многим» на следующем примере:
10+
11+
Один автор может написать несколько книг, а одна книга может быть написана несколькими авторами. Для каждой книги известны ее количество и цена.
12+
13+
1. Создать таблицу author, в которую включить уникальных авторов книг, хранящихся на складе:
14+
15+
![ ](https://ucarecdn.com/3762c894-7798-4ff7-a254-4068635de34e/)
16+
17+
2. В обеих таблицах необходимо определить первичный ключ, в нашем случае в таблице book он уже есть, поэтому достаточно включить первичный ключ author_id в таблицу author:
18+
19+
![ ](https://ucarecdn.com/961abd2a-0a7c-42c4-ab52-b4e9cb2d9ceb/)
20+
21+
3. Создать новую таблицу-связку, состоящую из двух столбцов, соответствующих по имени и типу ключевым столбцам исходных таблиц. Каждый из этих столбцов является внешним ключом (FOREIGN KEY) и связан с ключевым столбцом каждой таблицы. Для наглядности связи на схеме обозначаются стрелкой от ключевого столбца исходной таблицы к внешнему ключу связной таблицы.
22+
23+
![ ](https://ucarecdn.com/6943bc53-bbe5-410b-9264-00b20eb0f017/)
24+
25+
4. Дальше необходимо определиться с первичным ключом таблицы-связки. Можно сделать два ключевых столбца, тогда все записи в этой таблице должны быть уникальными, то есть не повторяться. Для связи автор-книга этот вариант подходит. Но в некоторых случаях записи в таблице-связке могут повторяться, например, если мы будем продавать книги покупателям (один человек может купить несколько книг, а одну и ту же книгу могут купить несколько человек). Тогда в таблицу-связку включают дополнительные столбцы для идентификации записей, например, дату продажи, также в таблицу-связку добавляют первичный ключ. Мы воспользуемся вторым способом:
26+
27+
![ ](https://ucarecdn.com/9e4529dc-355a-4675-a782-a824fd11d4ce/)
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
## Действия при удалении записи главной таблицы
2+
3+
С помощью выражения ON DELETE можно установить действия, которые выполняются для записей подчиненной таблицы при удалении связанной строки из главной таблицы. При удалении можно установить следующие опции:
4+
5+
- CASCADE: автоматически удаляет строки из зависимой таблицы при удалении связанных строк в главной таблице.
6+
- SET NULL: при удалении связанной строки из главной таблицы устанавливает для столбца внешнего ключа значение NULL. (В этом случае столбец внешнего ключа должен поддерживать установку NULL).
7+
- SET DEFAULT похоже на SET NULL за тем исключением, что значение внешнего ключа устанавливается не в NULL, а в значение по умолчанию для данного столбца.
8+
- RESTRICT: отклоняет удаление строк в главной таблице при наличии связанных строк в зависимой таблице.
9+
Важно! Если для столбца установлена опция SET NULL, то при его описании нельзя задать ограничение на пустое значение.
10+
11+
**Пример 1.** Будем считать, что при удалении автора из таблицы author, необходимо удалить все записи о книгах из таблицы book, написанные этим автором. Данное действие необходимо прописать при создании таблицы.
12+
13+
```sql
14+
CREATE TABLE book (
15+
book_id INT PRIMARY KEY AUTO_INCREMENT,
16+
title VARCHAR(50),
17+
author_id INT NOT NULL,
18+
price DECIMAL(8,2),
19+
amount INT,
20+
FOREIGN KEY (author_id) REFERENCES author (author_id) ON DELETE CASCADE
21+
);
22+
```
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
## Связь «один ко многим»
2+
3+
Рассмотрим таблицу book(в ней столбец author переименован в name_author):
4+
```
5+
book_id title name_author price amount
6+
1 Мастер и Маргарита Булгаков М.А. 670.99 3
7+
2 Белая гвардия Булгаков М.А. 540.50 5
8+
3 Идиот Достоевский Ф.М. 460.00 10
9+
4 Братья Карамазовы Достоевский Ф.М. 799.01 2
10+
5 Стихотворения и поэмы Есенин С.А. 650.00 15
11+
```
12+
В этой таблице фамилии авторов повторяются для нескольких книг. А что, если придется вместо инициалов для каждого автора хранить его полное имя и отчество? Тогда, если в таблице содержится информация о 50 книгах Достоевского, придется 50 раз исправлять «Ф.М.» на «Федор Михайлович». При этом, если в некоторых записях использовать «Фёдор Михайлович» (c буквой ё), то мы вообще получим двух разных авторов...
13+
14+
Чтобы устранить эту проблему в реляционных базах данных создается новая таблица author, в которой перечисляются все различные авторы, а затем эта таблица связывается с таблицей book. При этом такая связь называется «один ко многим», таблица author называется главной, таблица book – связанной или подчиненной.
15+
16+
Связь «один ко многим» имеет место, когда одной записи главной таблицы соответствует несколько записей связанной таблицы, а каждой записи связанной таблицы соответствует только одна запись главной таблицы.
17+
18+
### Этапы реализации связи «один ко многим» на следующем примере:
19+
20+
1. Создать таблицу author, в которую включить уникальных авторов книг, хранящихся на складе.
21+
22+
![ ](https://ucarecdn.com/ebb2959d-32be-4d80-8855-abe8ce6ec4cb/)
23+
24+
2. Обе таблицы должны содержать первичный ключ, в таблице book он уже есть, в таблицу authorдобавим ключ author_id.
25+
26+
![ ](https://ucarecdn.com/88d82e42-3e5b-4e9a-b8e0-78f27f348b1b/)
27+
28+
3. Включить в таблицу book связанный столбец (внешний ключ, FOREIGN KEY), соответствующий по имени и типу ключевому столбцу главной таблицы (в нашем случае это столбец author_id). Для наглядности связь на схеме обозначается стрелкой от ключевого столбца главной таблицы к внешнему ключу связной таблицы.
29+
30+
![ ](https://ucarecdn.com/d504072b-bad1-4040-8f49-f5b7102fa1ca/)
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
### Задание 1.
2+
Создать таблицу author следующей структуры:
3+
```
4+
author_id INT PRIMARY KEY AUTO_INCREMENT
5+
name_author VARCHAR(50)
6+
```
7+
8+
### Задание 2.
9+
Заполнить таблицу author. В нее включить следующих авторов:
10+
```
11+
Query result:
12+
+-----------+------------------+
13+
| author_id | name_author |
14+
+-----------+------------------+
15+
| 1 | Булгаков М.А. |
16+
| 2 | Достоевский Ф.М. |
17+
| 3 | Есенин С.А. |
18+
| 4 | Пастернак Б.Л. |
19+
+-----------+------------------+
20+
Affected rows: 4
21+
```
22+
23+
### Задание 3.
24+
Перепишите запрос на создание таблицы book , чтобы ее структура соответствовала структуре, показанной на логической схеме (таблица genre уже создана, порядок следования столбцов - как на логической схеме в таблице book, genre_id - внешний ключ) . Для genre_id ограничение о недопустимости пустых значений не задавать. В качестве главной таблицы для описания поля genre_idиспользовать таблицу genre следующей структуры:
25+
26+
```sql
27+
genre_id INT PRIMARY KEY AUTO_INCREMENT
28+
name_genre VARCHAR(30)
29+
```
30+
31+
- Логическая схема (нужно создать только таблицу book):
32+
33+
![ ](https://ucarecdn.com/6943bc53-bbe5-410b-9264-00b20eb0f017/)
34+
35+
### Задание 4.
36+
Создать таблицу book той же структуры, что и на предыдущем шаге. Будем считать, что при удалении автора из таблицы author, должны удаляться все записи о книгах из таблицы book, написанные этим автором. А при удалении жанра из таблицы genre для соответствующей записи book установить значение Null в столбце genre_id.
37+
```sql
38+
CREATE TABLE book (
39+
book_id INT PRIMARY KEY AUTO_INCREMENT,
40+
title VARCHAR(50),
41+
author_id INT NOT NULL,
42+
price DECIMAL(8,2),
43+
amount INT,
44+
FOREIGN KEY (author_id) REFERENCES author (author_id) ON DELETE CASCADE
45+
);
46+
```
47+
48+
## Задание 5.
49+
Добавьте три последние записи (с ключевыми значениями 6, 7, 8) в таблицу book, первые 5 записей уже добавлены:
50+
```
51+
book_id title author_id genre_id price amount
52+
1 Мастер и Маргарита 1 1 670.99 3
53+
2 Белая гвардия 1 1 540.50 5
54+
3 Идиот 2 1 460.00 10
55+
4 Братья Карамазовы 2 1 799.01 3
56+
5 Игрок 2 1 480.50 10
57+
6 Стихотворения и поэмы 3 2 650.00 15
58+
7 Черный человек 3 2 570.20 6
59+
8 Лирика 4 2 518.99 2
60+
```

0 commit comments

Comments
 (0)