При создании таблицы с реляционными данными требуется использование так называемых ключей. Они бывают первичными (primary key) и внешними. Далее предстоит разобраться с тем, как их создать и удалить.
Представленная информация пригодится всем, кто планирует работать в базе данных SQL Language и T-SQL. Она подойдет как новичкам, так и уже опытным специалистам.
Определение
Первичный ключ – это специальное поле в таблице, которое однозначно идентифицирует каждую запись/строку в БД. Они содержат уникальные значения. NULL в столбце первичного ключа стоять не может.
Соответствующий ключ – это комбинация полей, однозначно определяющая запись. Если для таблицы БД был создан такой элемент в определенном поле, в нем не может быть несколько записей с одинаковыми значениями.
Первичный ключ может быть:
- естественным – он существует в настоящем мире (паспортные данные, фамилии и имена и так далее);
- суррогатным – не поддерживает существование в реальности (пример – порядковый номер).
Соответствующий элемент должен являться минимально достаточным. В нем должны отсутствовать поля, удаление которых не отразится непосредственно на уникальности. Соответствующее правило не является обязательным, но его рекомендуется соблюдать.
Особенности
Создается первичный ключ с некоторыми ограничениями:
- Записи, которые относятся к соответствующему первичному идентификатору, должны быть обязательно уникальными. Это значит, что, если первичные ключи состоят из одного поля, все записи в нем – неповторимые. При содержании идентификатора сразу в нескольких «областях», комбинация задействованных полей уникальна. В отдельных частях допускаются повторения.
- Записи в полях, которые относятся к primary key, обязательно заполняются информацией. Пустыми они быть не могут. Соответствующее ограничение в PostgreSQL носит название not null.
- Для каждой таблички в базе данных можно создавать всего один первичный ключ.
Запомнив соответствующие принципы, добиться желаемого результата будет намного проще.
Простой и составной ключи
Простой ключ – это уникальный идентификатор, который включает в себя всего одно поле (атрибут). Он является наиболее распространенным.
Составной первичный ключ – идентификатор, состоящий из нескольких (два и более) атрибутов. Иногда он называется композитным (composite key).
Пример – личных документов одного типа с одними и теми же данными (серия и номер) не бывает. Из-за этого в отношении, содержащем сведения о людях, первичным ключом выступает только подмножество полей из типа личного документа, его серии и номера. Других вариантов нет и быть не может.
Создание
Задумываясь над тем, как создать первичный (primary) ключ в базе данных, необходимо обратить внимание на несколько операторов:
- create table;
- alter table.
Оба варианта подойдут для непосредственного формирования уникального идентификатора в БД. Далее предстоит изучить каждый из них более подробно.
Create table
Первичный ключ может быть создан при непосредственном выполнении оператора create table, который поддерживает язык SQL. Он обладает следующим синтаксисом:
Или:
Здесь:
- table_name – имя таблицы, которую хочется создать;
- pk_col1, pk_col2, …, pk_col_n – определяют составляющие первичного ключа;
- column1, column2 – столбцы, создаваемые в БД;
- constraint_name – название первичного ключа.
Позже будет изучен наглядный пример, с помощью которого удастся лучше разобраться с изучаемой темой.
Alter create
Операторы языка SQL позволяют создавать первичные ключи через alter create. Этот вариант применим для ситуации, в которой таблица уже существует. Primary key в ней формируется позже.
Синтаксис будет иметь следующий вид:
Здесь:
- table_name – имя таблицы, в которой будет создаваться уникальный идентификатор;
- constraint_name – название primary key;
- column1, column2, …, column_n – составляющие уникального идентификатора.
Больше ничего о том, как создать первичный (primary) ключ, знать не нужно. Этой информации хватит для начала работы с уникальными идентификаторами.
Наглядные примеры
Операторы языка SQL позволяют создавать идентификаторы таблиц несколькими способами. Первый – это через create table. Вот наглядный пример применения соответствующей концепции на практике.
В нем создан первичный ключ для таблицы suppliers. Он носит название sources_pk. Включает в себя только один столбец – supplier_id.
Выше – альтернативный синтаксис. Он подойдет при создании обычного первичного ключа для таблицы через create table. Если он составной, то для формирования такого идентификатора подойдет исключительно первый вариант. В нем ключи определены в конце оператора create table. На практике это выглядит так:
Здесь происходит создание key с именем contacts_pk. Он включает в себя комбинацию сразу нескольких столбцов. А именно – last_name и first_name. Из-за этого каждое их сочетание должно являться уникальным для таблицы contacts.
Alter table – пример
А вот еще один наглядный пример. Он позволяет сделать keys через alter table.
В заданном примере уже есть готовая таблица под названием suppliers. Primary key здесь – это sources_pk. Он формируется для ранее созданной таблицы в SQL. Включает в себя столбец supplier_id. Это – вариант всего для идентификатора всего с одним полем.
А вот – пример, который позволяет сформировать рассматриваемый компонент с несколькими «областями». В нем первичным ключом в SQL выступает supplier_pk, который содержит комбинации столбцов supplier_id, а также supplier_name.
О связи между таблицами
Предложенные ранее примеры объясняют создание идентификатора для одной таблицы. Это редкое явление в базах данных. Обычно в них несколько таблиц, связанных между собой. Первостепенной задачей, которую поддерживают «ключевые идентификаторы» — это уникальная идентификация каждой строчки. Также primary key решает еще одну задачу – связывание нескольких заданных таблиц. Для этого используются:
- первичные ключевые элементы;
- внешний ключ SQL.
В одной таблице создается внешний ключ. Он будет ссылаться на поля другой имеющейся таблицы. Здесь действуют такие ограничения:
- соответствующие поля присутствуют в той таблице, на которую ссылается внешний key;
- ссылается внешний ключ обычно на primary key другой таблицы.
В качестве наглядного примера можно взять таблицу «Ученики» — pupils. Она будет выглядеть так:
Вторая табличка – «Успеваемость» — evaluations:
В качестве первичного ключа определяют поле «ФИО» из «Ученики». Связано это с тем, что оно есть как в первом «списке», так и во втором. Оценку ученику, которого не существует, в реальной жизни поставить не получится.
Первичный ключ – это «ФИО» в «Учениках». Внешним выступит такое же поле, но из «Успеваемость». Если в первом «списке» удалить слово или какие-нибудь данные, все его оценки удаляются из второго.
Также стоит обратить внимание на то, что первичный ключ будет автоматически создавать индекс. С их помощью удается быстрее получать доступ к строкам. Индексы – ключевые компоненты, которые накладывают ограничения на уникальность. Двух Петровых Петров Петровичей существовать не может.
Только в реальности такое имеет место. Поэтому приходится искать выходы из ситуации. Исправить положение помогают такие компоненты и «слова» как:
- первичный ключ составного типа – в качестве него можно задействовать поля «ФИО», а также «Класс»;
- суррогатный первичный идентификатор – в «Ученики» добавить поле «Номер ученика» (id int), а затем сделать его первичным;
- добавление более уникального поля – в качестве примера допускается использование уникального номера зачетной книжки.
Запомнив все эти слова о primary в SQL, можно изучить несколько наглядных примеров реализации задачи. Они представлены здесь и тут во всех подробностях.
Удаление
Если первичный ключ больше не нужен, его можно удалить. Для этого используется оператор Atler Table:
В этом синтаксисе table_name – табличка, которую необходимо откорректировать.
Выше – наглядный пример того, как это выглядит в коде. Имя уникального идентификатора указывать не потребуется. Связано это с тем, что он у таблички может быть всего один. Система автоматически поймет, от чего необходимо избавиться.
Хотите знать про базы данных больше? Записывайтесь на курс!
Прокачать навыки работы с базами данных можно на курсах Otus.