Два первичных ключа, как реализоватья
Почему в некоторых таблицах есть 3 первичных ключа?
Нашел в интернете скрины нужной базы данных Нужно все это дело перенести в MS SQL SERVER Не могу.
Внешний ключ для таблицы содержащих 2 первичных ключа
Есть таблица у которой 2 первичных ключа. Вопрос: как будет выглядеть внешний ключ другой таблицы.
Как взять два внешних ключа?
Есть две модели public class Tender < public int Id < get; set; >public.

Как могло получиться два одинаковых ключа в HashMap?
Я буду приводить просто примеры. Вопрос сложный для меня, поэтому решил обратиться за помощью. Вот.
В таблице может быть несколько первичных ключей?
Недавно где-то прочитал, что первичный ключ может быть только один. Это так?
Заранее выражаю огромную благодарность всем, кто поможет
- Вопрос задан более трёх лет назад
- 5140 просмотров
5 комментариев
Простой 5 комментариев
Выше всё верно сказали — можно сделать ключ составным, т.е. по нескольким столбцам. Например:
constraint FK_Table2 foreign key (id_t1, t1_1, t1_2) references Table1 (id_t1, t1_1, t1_2)

JackShcherbakov @JackShcherbakov Автор вопроса
При ссоздании таблицы если мы укажем в 2-х столбцах PRIMARY KEY, то разве не создастся 2 первичных или что?

JackShcherbakov @JackShcherbakov Автор вопроса
Лентюй, а что произойдёт в этом случае? Что будет первичным ключом и что будет индексом? Я похоже не понимаю что делает PRIMARY KEY и как создать первичный ключ.

JackShcherbakov @JackShcherbakov Автор вопроса
Лентюй, а как явно указать какой из этих всех PRIMARY KEY является первичным?

JackShcherbakov @JackShcherbakov Автор вопроса
Лентюй, Я правильно понимаю что при создании/изменении таблицы я могу указать несколько PRIMARY KEY, в том числе составных. Для них автоматически сделаемся индекс. И мне самому решать какой из них — первичный и я никак явно не говорю MYSQL о том какой ключ является первичным. То есть, грубо говоря, информация о том какой ключ является первичным -своего рода соглашение + MySQL не знает какой именно первичный. Или все таки можна явно указать «первичность» ключа.
Решения вопроса 0
Ответы на вопрос 4

web-программист
Первичный ключ может быть только один.
НО
Первичный ключ может быть по нескольким полям. Это иногда может вводить в заблуждение, что их несколько, но это не так. Он всегда только один.
Ответ написан более трёх лет назад
Нравится 3 3 комментария

JackShcherbakov @JackShcherbakov Автор вопроса
Я правильно понимаю что при создании/изменении таблицы я могу указать несколько PRIMARY KEY, в том числе составных. Для них автоматически сделаемся индекс. И мне самому решать какой из них — первичный и я никак явно не говорю MYSQL о том какой ключ является первичным. То есть, грубо говоря, информация о том какой ключ является первичным -своего рода соглашение + MySQL не знает какой именно первичный. Или все таки можна явно указать «первичность» ключа.

несколько PRIMARY KEY
Первичный ключ может быть только один

JackShcherbakov, Вы путаете PRIMARY KEY, FOREIGN KEY, INDEX.
PRIMARY KEY — данное ограничение позволяет однозначно идентифицировать каждую запись в таблице.
Первичный ключ должен содержать уникальные значения.
Первичный ключ не может содержать NULL значений.
Каждая таблица должна (хоть некоторые субд и разрешают не указывать явно PK) иметь первичный ключ, и каждая таблица может иметь только один первичный ключ.
SQL — Создание первичного ключа
От автора: в этой статье мы поговорим про создание первичного ключа SQL. Первичный ключ — это поле в таблице, которое однозначно идентифицирует каждую строку/запись в таблице базы данных. Первичные ключи должны содержать уникальные значения. В столбце первичного ключа не может содержаться значений NULL.
В таблице может быть только один первичный ключ, который может состоять из одного или нескольких полей. Когда в качестве первичного ключа используются несколько полей, он называется составным.
Если для таблицы первичный ключ задан в определенном поле, то в этом поле не может содержаться двух записей с одинаковыми значениями.
Примечание. Вы должны учитывать данные принципы при создании таблиц базы данных.
Создание первичного ключа
Ниже приведен код, в котором столбец ID определяется в качестве первичного ключа для таблицы CUSTOMERS.
Ключи в 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 – табличка, которую необходимо откорректировать.
Выше – наглядный пример того, как это выглядит в коде. Имя уникального идентификатора указывать не потребуется. Связано это с тем, что он у таблички может быть всего один. Система автоматически поймет, от чего необходимо избавиться.
Хотите знать про базы данных больше? Записывайтесь на курс!
