0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Первичные и внешние ключи в базах данных относятся к ограничению. Оно включает в себя различные модификаторы колонок в базе данных, которые добавляют ограничения на их содержимое. В этом уроке мы рассмотрим уже известные ограничения, а также изучим новые.</p>
1
<p>Первичные и внешние ключи в базах данных относятся к ограничению. Оно включает в себя различные модификаторы колонок в базе данных, которые добавляют ограничения на их содержимое. В этом уроке мы рассмотрим уже известные ограничения, а также изучим новые.</p>
2
<h2>Первичный ключ</h2>
2
<h2>Первичный ключ</h2>
3
<p><strong>Первичный ключ</strong>однозначно идентифицирует каждую запись внутри таблицы. Задается с помощью фразы PRIMARY KEY, которая добавляется после указания типа, когда создается таблица. Первичный ключ в таблице может быть только один, и для него используется суррогатный ключ - идентификатор, у которого нет физического смысла:</p>
3
<p><strong>Первичный ключ</strong>однозначно идентифицирует каждую запись внутри таблицы. Задается с помощью фразы PRIMARY KEY, которая добавляется после указания типа, когда создается таблица. Первичный ключ в таблице может быть только один, и для него используется суррогатный ключ - идентификатор, у которого нет физического смысла:</p>
4
<h2>Внешний ключ</h2>
4
<h2>Внешний ключ</h2>
5
<p><strong>Внешний ключ</strong>- это ограничение, которое связывает указанную колонку с данными из другой таблицы. Такое ограничение гарантирует целостность данных. То есть попытка удалить данные, у которых есть зависимые данные, приведет к ошибке:</p>
5
<p><strong>Внешний ключ</strong>- это ограничение, которое связывает указанную колонку с данными из другой таблицы. Такое ограничение гарантирует целостность данных. То есть попытка удалить данные, у которых есть зависимые данные, приведет к ошибке:</p>
6
<p>В данной таблице атрибут product_id связан с атрибутом id таблицы products. Синтаксически для этого добавляется ключевое слово<em>REFERENCES</em>после типа поля. Затем добавляется имя таблицы, на которую идет связь. В скобках указывается поле, с которым эта связь создается. Наличие такой связи проявляется следующим образом:</p>
6
<p>В данной таблице атрибут product_id связан с атрибутом id таблицы products. Синтаксически для этого добавляется ключевое слово<em>REFERENCES</em>после типа поля. Затем добавляется имя таблицы, на которую идет связь. В скобках указывается поле, с которым эта связь создается. Наличие такой связи проявляется следующим образом:</p>
7
<ul><li>Если попробовать вставить в orders запись со значением product_id, которого нет в таблице products, то возникнет ошибка</li>
7
<ul><li>Если попробовать вставить в orders запись со значением product_id, которого нет в таблице products, то возникнет ошибка</li>
8
<li>Если попытаться удалить запись из products, на которую есть ссылки из таблицы orders, то возникнет ошибка</li>
8
<li>Если попытаться удалить запись из products, на которую есть ссылки из таблицы orders, то возникнет ошибка</li>
9
</ul><p>Внешний ключ проверяет целостность данных и не позволяет появляться "мусору". Поэтому лучше ставить внешние ключи на все идентификаторы, для которых есть родительская таблица в базе.</p>
9
</ul><p>Внешний ключ проверяет целостность данных и не позволяет появляться "мусору". Поэтому лучше ставить внешние ключи на все идентификаторы, для которых есть родительская таблица в базе.</p>
10
<p>Внешние ключи поддерживают несколько вариаций. Таким образом они поддерживают целостность, но не приводят к ошибкам при попытке удалить запись.</p>
10
<p>Внешние ключи поддерживают несколько вариаций. Таким образом они поддерживают целостность, но не приводят к ошибкам при попытке удалить запись.</p>
11
<p><strong>Вариант 1</strong>- Каскадное удаление:</p>
11
<p><strong>Вариант 1</strong>- Каскадное удаление:</p>
12
<p>В таком варианте при попытке удалить родительскую запись (<em>products</em>) будут удалены все записи в<em>orders</em>, которые ссылаются на этот продукт. Каскадное удаление - опасная опция, так как можно случайно лишиться данных. Стоит хорошо подумать, прежде чем включать ее.</p>
12
<p>В таком варианте при попытке удалить родительскую запись (<em>products</em>) будут удалены все записи в<em>orders</em>, которые ссылаются на этот продукт. Каскадное удаление - опасная опция, так как можно случайно лишиться данных. Стоит хорошо подумать, прежде чем включать ее.</p>
13
<p><strong>Вариант 2</strong>- Записи остаются, но вместо идентификатора проставляется null:</p>
13
<p><strong>Вариант 2</strong>- Записи остаются, но вместо идентификатора проставляется null:</p>
14
<p>Используется нечасто, но иногда может быть полезно.</p>
14
<p>Используется нечасто, но иногда может быть полезно.</p>
15
<h2>Not Null</h2>
15
<h2>Not Null</h2>
16
<p><strong>Not Null</strong>- это ограничение указывает на то, что колонка не может содержать null значения. Его можно комбинировать с другими ограничениями, например, внешними ключами. Первичный ключ является NOT NULL по умолчанию:</p>
16
<p><strong>Not Null</strong>- это ограничение указывает на то, что колонка не может содержать null значения. Его можно комбинировать с другими ограничениями, например, внешними ключами. Первичный ключ является NOT NULL по умолчанию:</p>
17
<h2>Уникальность</h2>
17
<h2>Уникальность</h2>
18
<p>Чтобы гарантировать уникальность значений одного поля, используется ключевое слово UNIQUE. Обычно его используют в описании конкретного поля, когда создается таблица:</p>
18
<p>Чтобы гарантировать уникальность значений одного поля, используется ключевое слово UNIQUE. Обычно его используют в описании конкретного поля, когда создается таблица:</p>
19
<p>UNIQUE никогда не используется совместно с первичным ключом, так как он уникален по определению.</p>
19
<p>UNIQUE никогда не используется совместно с первичным ключом, так как он уникален по определению.</p>
20
<p>Иногда бывает нужно реализовать уникальность по двум или более атрибутам. Для этого нужно описать UNIQUE отдельно от конкретного поля:</p>
20
<p>Иногда бывает нужно реализовать уникальность по двум или более атрибутам. Для этого нужно описать UNIQUE отдельно от конкретного поля:</p>
21
<p>Существует ситуация, в которой ограничение уникальности не срабатывает. Такое происходит, если хотя бы в одном из столбцов, включенных в ограничение, встречается NULL. По стандарту, NULL никогда не равен самому себе.</p>
21
<p>Существует ситуация, в которой ограничение уникальности не срабатывает. Такое происходит, если хотя бы в одном из столбцов, включенных в ограничение, встречается NULL. По стандарту, NULL никогда не равен самому себе.</p>
22
<h2>Выводы</h2>
22
<h2>Выводы</h2>
23
<p>В этом уроке мы узнали чуть больше об ограничении первичного и внешнего ключей. Еще познакомились с новыми полезными ограничениями: Not Null и уникальность. Они указывают на то, что колонка не может содержать null значения и гарантируют уникальность поля, соответственно.</p>
23
<p>В этом уроке мы узнали чуть больше об ограничении первичного и внешнего ключей. Еще познакомились с новыми полезными ограничениями: Not Null и уникальность. Они указывают на то, что колонка не может содержать null значения и гарантируют уникальность поля, соответственно.</p>