9) Ключи СУБД
Ключ СУБД – это атрибут или набор атрибутов, который помогает идентифицировать строку (кортеж) в отношении (таблице). Они позволяют найти связь между двумя таблицами. Клавиши помогают однозначно идентифицировать строку в таблице по комбинации одного или нескольких столбцов в этой таблице.
Пример:
| ID сотрудника | Имя | Фамилия |
| 11 | Эндрю | Джонсон |
| 22 | Том | Дерево |
| 33 | Alex | здоровый |
В приведенном выше примере идентификатор сотрудника является первичным ключом, поскольку он однозначно идентифицирует запись сотрудника. В этой таблице ни один другой сотрудник не может иметь такой же идентификатор сотрудника.
В этом уроке вы узнаете:
Зачем нам нужен ключ?
Вот причины использования ключей в системе СУБД.
- Ключи помогают идентифицировать любую строку данных в таблице. В реальном приложении таблица может содержать тысячи записей. Более того, записи могут быть продублированы. Ключи гарантируют, что вы сможете однозначно идентифицировать запись таблицы, несмотря на эти проблемы.
- Позволяет установить связь между и определить связь между таблицами
- Помочь вам обеспечить идентичность и целостность в отношениях.
Различные ключи в системе управления базами данных
СУБД имеет следующие семь типов ключей, каждый из которых имеет свои различные функции:
- Супер Ключ
- Основной ключ
- Ключ-кандидат
- Альтернативный ключ
- Внешний ключ
- Составной ключ
- Композитный ключ
- Суррогатный ключ
Что такое супер ключ?
Суперключ – это группа из одного или нескольких ключей, которая идентифицирует строки в таблице. Супер ключ может иметь дополнительные атрибуты, которые не нужны для уникальной идентификации.
Пример:
| EmpSSN | EmpNum | EmpName |
| 9812345098 | AB05 | показанный |
| 9876512345 | AB06 | Рослин |
| 199937890 | AB07 | Джеймс |
В приведенном выше примере имена EmpSSN и EmpNum являются суперключами.
Что такое первичный ключ?
PRIMARY KEY – это столбец или группа столбцов в таблице, которые уникально идентифицируют каждую строку в этой таблице. Первичный ключ не может быть дубликатом, то есть одно и то же значение не может появляться в таблице более одного раза. Таблица не может иметь более одного первичного ключа.
Правила определения первичного ключа:
- Две строки не могут иметь одинаковое значение первичного ключа
- Для каждой строки должно быть значение первичного ключа.
- Поле первичного ключа не может быть пустым.
- Значение в столбце первичного ключа никогда не может быть изменено или обновлено, если какой-либо внешний ключ ссылается на этот первичный ключ.
Пример:
В следующем примере <code> StudID </ code> является первичным ключом.
| StudID | Ролл № | Имя | Фамилия | Электронное письмо |
| 1 | 11 | Том | Цена | abc@gmail.com |
| 2 | 12 | Ник | Райт | xyz@gmail.com |
| 3 | 13 | Dana | Натана | mno@yahoo.com |
Что такое альтернативный ключ?
ALTERNATE KEYS – это столбец или группа столбцов в таблице, которые однозначно идентифицируют каждую строку в этой таблице. Таблица может иметь несколько вариантов выбора первичного ключа, но в качестве первичного ключа может быть задан только один. Все ключи, которые не являются первичными ключами, называются альтернативными ключами.
Пример:
В этой таблице StudID, Roll No, Email могут стать первичным ключом. Но поскольку StudID является первичным ключом, Roll No, Email становится альтернативным ключом.
| StudID | Ролл № | Имя | Фамилия | Электронное письмо |
| 1 | 11 | Том | Цена | abc@gmail.com |
| 2 | 12 | Ник | Райт | xyz@gmail.com |
| 3 | 13 | Dana | Натана | mno@yahoo.com |
Что такое ключ-кандидат?
CANDIDATE KEY – это набор атрибутов, которые однозначно идентифицируют кортежи в таблице. Ключ-кандидат – это супер-ключ без повторяющихся атрибутов. Первичный ключ должен быть выбран из возможных ключей. В каждой таблице должен быть хотя бы один ключ-кандидат. Таблица может иметь несколько ключей-кандидатов, но только один первичный ключ.
Свойства ключа-кандидата:
- Он должен содержать уникальные значения
- Ключ-кандидат может иметь несколько атрибутов
- Не должен содержать нулевые значения
- Он должен содержать минимальные поля для обеспечения уникальности
- Уникальная идентификация каждой записи в таблице
Пример: в данной таблице идентификатор студента, номер ролика и адрес электронной почты являются ключами-кандидатами, которые помогают нам однозначно идентифицировать запись студента в таблице.
| StudID | Ролл № | Имя | Фамилия | Электронное письмо |
| 1 | 11 | Том | Цена | abc@gmail.com |
| 2 | 12 | Ник | Райт | xyz@gmail.com |
| 3 | 13 | Dana | Натана | mno@yahoo.com |
Что такое внешний ключ?
FOREIGN KEY – это столбец, который создает связь между двумя таблицами. Назначение внешних ключей заключается в поддержании целостности данных и возможности навигации между двумя различными экземплярами объекта. Он действует как перекрестная ссылка между двумя таблицами, так как ссылается на первичный ключ другой таблицы.
Пример:
| DeptCode | DEPTNAME |
| 001 | Наука |
| 002 | английский |
| 005 | компьютер |
| ID учителя | Fname | Lname |
| B002 | Дэвид | сигнализатор |
| B017 | Сара | Джозеф |
| B009 | Майк | Брантон |
В этом примере у нас есть два стола, учить и отдел в школе. Тем не менее, нет способа узнать, какой поиск работает в каком отделе.
В этой таблице, добавив внешний ключ в Deptcode к имени учителя, мы можем создать связь между двумя таблицами.
| ID учителя | DeptCode | Fname | Lname |
| B002 | 002 | Дэвид | сигнализатор |
| B017 | 002 | Сара | Джозеф |
| B009 | 001 | Майк | Брантон |
Эта концепция также известна как ссылочная целостность.
Что такое составной ключ?
КЛАВИША СОЕДИНЕНИЯ имеет два или более атрибута, которые позволяют однозначно распознавать конкретную запись. Возможно, что каждый столбец не может быть уникальным сам по себе в базе данных. Однако при объединении с другим столбцом или столбцами комбинация составных ключей становится уникальной. Целью составного ключа является уникальная идентификация каждой записи в таблице.
Пример:
| № заказа | PorductID | наименование товара | Количество |
| B005 | JAP102459 | мышь | 5 |
| B005 | DKT321573 | USB | 10 |
| B005 | OMG446789 | ЖК монитор | 20 |
| B004 | DKT321573 | USB | 15 |
| B002 | OMG446789 | Лазерный принтер | 3 |
В этом примере OrderNo и ProductID не могут быть первичным ключом, поскольку они не уникально идентифицируют запись. Однако можно использовать составной ключ из идентификатора заказа и идентификатора продукта, поскольку он однозначно идентифицирует каждую запись.
Что такое композитный ключ?
КОМПОЗИЦИОННЫЙ КЛЮЧ – это комбинация двух или более столбцов, которые однозначно идентифицируют строки в таблице. Комбинация столбцов гарантирует уникальность, хотя индивидуальная уникальность не гарантируется. Следовательно, они объединены, чтобы однозначно идентифицировать записи в таблице.
Разница между составным и составным ключом заключается в том, что любая часть составного ключа может быть внешним ключом, но составной ключ может быть или не быть частью внешнего ключа.
Что такое суррогатный ключ?
Искусственный ключ, предназначенный для уникальной идентификации каждой записи, называется суррогатным ключом. Такие ключи уникальны, потому что они создаются, когда у вас нет естественного первичного ключа. Они не придают никакого значения данным в таблице. Суррогатный ключ обычно является целым числом.
| Fname | Фамилия | Время начала | Время окончания |
| Энн | кузнец | 9:00 | 18:00 |
| Джек | Фрэнсис | 8:00 | 17:00 |
| Анна | McLean | 11:00 | 20:00 |
| показанный | Willam | 14:00 | 23:00 |
Выше приведен пример, показывающий сроки смены разных сотрудников. В этом примере суррогатный ключ необходим для уникальной идентификации каждого сотрудника.
Ключи в SQL-таблицах

При создании таблицы с реляционными данными требуется использование так называемых ключей. Они бывают первичными (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 – табличка, которую необходимо откорректировать.
Выше – наглядный пример того, как это выглядит в коде. Имя уникального идентификатора указывать не потребуется. Связано это с тем, что он у таблички может быть всего один. Система автоматически поймет, от чего необходимо избавиться.
Primary key on two columns sql server

In this video we will understand what is a composite primary key and why we need it with a real world example.
What is a primary key
A primary key uniquely identifies a row in a table. You cannot store NULL or duplicate values in a primary key column.
In the Books table, BookId column is the primary key.

Similarly, in the Authors table, AuthorId is the primary key.

Why do we need a primary key?
Well to uniquely identify a table row. Even if we have 2 authors with the same first and last names, we can uniquely identify them using the AuhtorId column.
In both these examples, primary key contains only one column. In the case of Books table, it is the BookId column and in the case of Authors , it is AuthorId .
What is a composite primary key
Well, a primary key that is made up of 2 or more columns is called a composite primary key. A common real world use case for this is, when you have a many-to-many relationship between two tables i.e when multiple rows in one table are associated with multiple rows in another table.
For example, there is a many-to-many relationship between customers and products tables because a customer can purchase many products, and similarly a product like an iPhone for example can be purchased by many customers.
Another example, is Authors and Books . A single author can write many books and similarly a given book can be authored my multiple authors.
Relational database systems usually don’t allow us to implement a direct many-to-many relationship between two tables.

We need a third table and it is this table that contains the many-to-many relationship rows. This third table is commonly called link, join or junction table.

In a real world this junction table would contain only the 2 foreign key columns and nothing else. In our example, those 2 columns are AuthorId and BookId .

The following is the code to create a composite primary key. In our example, we have 2 columns in the composite primary key. We can have more than 2 columns if we want to, just include another comma and your third column.
Create composite primary key while creating table
Create composite primary key after creating table
In the above example, we are creating the composite primary key along with the table i.e while the table is being created, but what if we already have a table and want to create a composite primary key on that existing table. Well, the following is the code for that.
Composite primary key rules

A composite primary key is just like a primary key on a single column. All the rules still apply. Doesn’t allow null values and cannot contain duplicates. Values in an individual column can be duplicated, but across the columns they must be unique. Null values are not allowed in any columns in the composite primary key.
Для чего нужен составной ключ в mysql?

дата — повторяется, имена пользователей — повторяются.
нужен уникальный ключ. Им будет составной ключ из этих двух полей, потому что пара data-user всегда уникальна.


У меня например есть таблица «права доступа».
access (id,user_id,access_mode)
У одного пользователя не может быть два раза одно и тоже значение access_mode ( зачем допускать пользователя 2 раза к одному и тому же разделу сайта?)
Потому я использую двойной ключ (user_id,access_mode)
- Вконтакте

Артём, права разные есть. Для каждого пользователя может быть скольугодно разных прав.
Список прав хранится в другой таблице, и может меняться.
users (id,name)
access_modes (id,access_name)
access (user_id,access_mode_id)
access_modes:
1|может менять новости
2|может редактировать главную страницу
3|может удалять аккаунт
4|может забанить


Связка значение1-значение2 всегда уникально, хотя оба значения в любой колонке могут встречаться сколь угодно раз по отдельности.




Анатолий Цивилёв, Я это к чему. Нет связи между тем, составной индекс или нет и уникальный он или нет. Это теплое и мягкое и ни как это категории не сцеплены. Точно так же как не сцеплено создание ключей и fk в некоторых реализациях РСУБД.
Поэтому не стоит вводить в заблуждение автора и других читателей.
Составные ключи могут служить заменой специально вводимым идентификаторам.
Например есть таблица Пользователи вида Users(id, name) и таблица Фотки вида Photos(id, name).
Таблица содержащая фотки пользователей будет таблица UsersPhotos(user_id, photo_id). В данном случае эти два поля образуют составной ключ, эта связка будет уникальна и нет смысла вводить избыточный идентификатор, если этого не требует логика приложения.
- Вконтакте

Артём, это всего лишь абстрактный пример, как может использоваться.
Ниже я написал, как это используется у меня. Тут вы уже не засунете в таблицу users все их права.
Эта таблица нужна для поиска всех фотографий пользователя.
Следовательно, несмотря на то, что ключ здесь составной, но индекс нужен по user_id

- Вконтакте

- Вконтакте
Очень хороши составные ключи для таблиц с соотношениями типа многие-ко-многим. Например: есть таблица с авторами и таблица с книгами, но т.к. у одной книги может быть несколько авторов и у одного автора несколько книг, то сопоставление автор/книга мы можем хранить с таблице типа many-to-many. Вводить для неё суррогатный ключ (все эти id INT INSUGNED PRIMARY KEY AUTO_INCREMENT) совершенно не нужно — в качестве ключа можно взять комбинацию первичных ключей из таблиц авторов и книг.
А если мы имеет таблицу many-to-many, которая сопоставляет две других таблицы с естественными ключами, и выбрали для many-to-many составной ключ, являющийся, таким образом, комбинацией двух естественных ключей, то иногда получается вообще избавиться от лишнего JOIN при запросе, что очень неплохо, потому что самая важная информация уже есть в самом ключе.