Составной ключ sql что это
Перейти к содержимому

Составной ключ sql что это

  • автор:

Создание первичных ключей

Вы можете определить первичный ключ в SQL Server с помощью SQL Server Management Studio или Transact-SQL. Создание первичного ключа автоматически приводит к созданию соответствующего уникального кластеризованного индекса (или некластеризованного при наличии такого указания).

Перед началом

Ограничения

  • В таблице возможно наличие только одного ограничения по первичному ключу.
  • Все столбцы с ограничением PRIMARY KEY должны иметь признак NOT NULL. Если допустимость значения NULL не указана, то для всех столбцов c ограничением PRIMARY KEY устанавливается признак NOT NULL.

Безопасность

Разрешения

Создание новой таблицы с первичным ключом требует разрешения CREATE TABLE в базе данных и разрешения ALTER на схему, в которой создается таблица.

Создание первичного ключа в существующей таблице требует разрешения ALTER на таблицу.

Использование SQL Server Management Studio

Создание первичного ключа

  1. В обозреватель объектов щелкните правой кнопкой мыши таблицу, к которой нужно добавить уникальное ограничение, и выберите Пункт Конструктор.
  2. В Designer таблицы выберите селектор строк для столбца базы данных, который необходимо определить в качестве первичного ключа. Если вы хотите выбрать несколько столбцов, удерживайте нажатой клавишу CTRL, выбирая селекторы строк для других столбцов.
  3. Щелкните правой кнопкой мыши средство выбора строк столбца и выберите команду Задать первичный ключ.

Чтобы переопределить первичный ключ, необходимо удалить все связи с существующим первичным ключом и только после этого создавать новый первичный ключ. Появится сообщение, предупреждающее об автоматическом удалении в ходе процесса всех существующих связей.

Ключевой столбец-источник идентифицируется символом первичного ключа в соответствующем селекторе строк.

Если первичный ключ состоит более чем из одного столбца, то в одном столбце могут встречаться дублирующиеся значения, но все сочетания значений изо всех столбцов первичного ключа должны быть уникальными.

При определении составного ключа порядок столбцов в первичном ключе совпадает с порядком столбцов, показанным в таблице. Однако после создания первичного ключа порядок столбцов можно изменить. Дополнительные сведения см. в разделе Изменение первичных ключей.

Использование Transact-SQL

Создание первичного ключа в существующей таблице

В следующем примере создается первичный ключ для столбца TransactionID в базе данных AdventureWorks.

ALTER TABLE Production.TransactionHistoryArchive ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID PRIMARY KEY CLUSTERED (TransactionID); 

Создание первичного ключа в новой таблице

В следующем примере создается таблица и определяется первичный ключ для столбца TransactionID в базе данных AdventureWorks.

CREATE TABLE Production.TransactionHistoryArchive1 ( TransactionID int IDENTITY (1,1) NOT NULL , CONSTRAINT PK_TransactionHistoryArchive1_TransactionID PRIMARY KEY CLUSTERED (TransactionID) ) ; 

Создание первичного ключа с кластеризованным индексом в новой таблице

В следующем примере создается таблица и определяется первичный ключ для столбца CustomerID и кластеризованного индекса для TransactionID в базе данных AdventureWorks.

-- Create table to add the clustered index CREATE TABLE Production.TransactionHistoryArchive1 ( CustomerID uniqueidentifier DEFAULT NEWSEQUENTIALID() , TransactionID int IDENTITY (1,1) NOT NULL , CONSTRAINT PK_TransactionHistoryArchive1_CustomerID PRIMARY KEY NONCLUSTERED (CustomerID) ) ; -- Now add the clustered index CREATE CLUSTERED INDEX CIX_TransactionID ON Production.TransactionHistoryArchive1 (TransactionID); 

Дальнейшие действия

  • ALTER TABLE
  • CREATE TABLE
  • table_constraint

Нужно создать составной первичный ключ для таблицы

где KOL — количество Какой составной первичный ключ можно задать последней таблице(DOCUMENT2),не добавляя туда больше никаких полей? (Извиняюсь за кривую передачу таблиц, пыталась как можно точнее описать представление)

Отслеживать
user177221
задан 23 апр 2017 в 9:52
73 1 1 золотой знак 1 1 серебряный знак 9 9 бронзовых знаков

В большинстве организаций документы нумеруются в пределах года, вы уверены, что номер документа можно делать первичным ключом

23 апр 2017 в 11:44
Так изначально было указано в задании.
23 апр 2017 в 11:54

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Я бы в каждой таблице все-таки держал уникальный айдишник, не люблю составные ключи.

В данном же случае напрашивается составной ключ из полей NDM и KTOV. Пример скрипта:

CREATE TABLE [DOCUMENT2]( KTOV int not null, KOL int not null, CENA decimal(18,3) not null, SORT vnarchar(50) not null, -- вот это поле я бы исключил. денормализация. его всегда можно получить из таблицы TOVAR NDM int not null, CONSTRAINT [DOCUMENT2_PK] PRIMARY KEY CLUSTERED (KTOV ASC, NDM ASC)) 

UPD: второе поле в ключе должно быть NDM, как ссылка на таблицу DOCUMENT1. ASC — порядок сортировки индекса, во-возростанию. Можно указать по-убыванию одно или оба поля — DESC.

Как создать первичные и внешние ключи MySQL

В этой инструкции рассказываем про первичный и внешний ключи SQL, зачем они нужны и как их создать различными способами.

Эта инструкция — часть курса «MySQL для новичков».

Смотреть весь курс

Введение

Работа современных приложений и сложных сайтов, которыми мы привыкли пользоваться, невозможна без баз данных. Поэтому правильно настроенные БД важны для приложения не меньше, чем их дизайн и код, который с этой базой взаимодействует. Работа современных реляционных баз данных сложно представить без корректно настроенных первичных и внешних ключей. В этой инструкции мы подробно разберем создание этих ключей MySQL, расскажем для чего они нужны и как их использовать.

Облачные базы данных

Что такое первичный и внешний ключи и зачем они нужны

Начнем рассмотрение данного вопроса с двух самых главных элементов: первичного и внешнего ключей.

Первичный ключ или primary key

Первичный ключ — особенное поле в SQL-таблице, которое позволяет однозначно идентифицировать каждую запись в ней. Как правило, эти поля используются для хранения уникальных идентификаторов объектов, которые перечислены в таблице, например, это может быть ID клиента или товара.
Первичный ключ имеет несколько свойств:

  • каждая запись в таком поле должна быть уникальной;
  • запись в поле не должна быть пустой;
  • в одной таблице может быть только один ключ (существуют также составные ключи, которые могут включать в себя несколько полей, однако в этой статье мы не будем их рассматривать).

Внешний ключ или foreign key

Внешний ключ нужен для того, чтобы связать две разные SQL-таблицы между собой. Внешний ключ таблицы должен соответствует значению первичного ключа таблицы, с которой он связан. Это помогает сохранять согласованность базы данных путем обеспечения так называемой «ссылочной целостности» (referential integrity).

Давайте рассмотрим все это на примере простой базы данных. Для начала нам понадобится создать базу данных. Заходим в MySQL и создаем базу данных, в которой будут храниться записи о книгах в библиотеке:

create database slcbookshelf; 

пример БД

Так как дальше мы будем работать с этой базой, вводим команду:

use slcbookshelf; 

И создаем таблицу, в которой будут храниться записи о книгах в библиотеке:

CREATE TABLE books ( book_id INT NOT NULL, book_name VARCHAR(255) NOT NULL, book_category VARCHAR(255)); 

Создание первичного ключа при создании таблицы и с помощью ALTER TABLE

В созданной выше таблице ни одно из полей не является первичным ключом. Увидеть это мы можем, выполнив команду:

DESC books; 

Вывод команды будет выглядеть следующим образом:

mysql> DESC books; +---------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------------+--------------+------+-----+---------+-------+ | book_id | int | NO | | NULL | | | book_name | varchar(255) | NO | | NULL | | | book_category | varchar(255) | YES | | NULL | | +---------------+--------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) 

Первичный ключ при создании таблицы

Вы можете также создать его при создании таблицы, добавив в команду для создания таблицы следующую запись:

PRIMARY KEY (book_id) 

В таком случае поле book_id после создания таблицы будет являться первичным ключом для таблицы books.

Создание первичного ключа при помощи ALTER TABLE

Если таблица уже создана, а первичный ключ в ней не указан, вы можете создать ключевое поле, с помощью команды ALTER TABLE. Команда ALTER TABLE помогает изменять уже существующие столбцы, удалять их или добавлять новые. Чтобы определить первичный ключ в поле book_id, выполните команду:

ALTER TABLE books ADD PRIMARY KEY (book_id); Проверяем: mysql> DESC books; +---------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------------+--------------+------+-----+---------+-------+ | book_id | int | NO | PRI | NULL | | | book_name | varchar(255) | NO | | NULL | | | book_category | varchar(255) | YES | | NULL | | +---------------+--------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) 

Установка внешнего ключа MySQL при создании таблицы и с помощью ALTER TABLE

Предположим, у нас есть еще одна таблица под названием authors, которую нам необходимо связать с текущей таблицей books с помощью внешнего ключа author_id.

Внешний ключ при создании таблицы

Для того, чтобы привязать к таблице внешний ключ сразу при создании таблицы, вам необходимо дополнить запрос, которым вы создаете таблицу следующей записью:

FOREIGN KEY (author_id) REFERENCES authors(author_id) 

В итоге запрос, которым создается такая таблица будет выглядеть следующим образом:

CREATE TABLE books ( book_id INT NOT NULL, book_name VARCHAR(255) NOT NULL, book_category VARCHAR(255), FOREIGN KEY (author_id) REFERENCES authors(author_id)); 

Создание внешнего ключа при помощи ALTER TABLE

Если вам нужно определить поле уже созданной таблицы в качестве внешнего ключа, вы можете воспользоваться командой ALTER TABLE и создать внешний ключ в таблице командой:

ALTER TABLE books ADD FOREIGN KEY (author_id) REFERENCES authors(author_id); 

Сценарии использования внешнего ключа

Внешний ключ является очень важным и мощным инструментом в работе современных баз данных. С помощью внешнего ключа, например, вы можете настроить параметры, которые зададут действия при удалении или обновлении строки в таблице, настроить каскадное удаление или запретить изменять строку в таблице. Давайте рассмотрим на примерах.

Каскадное удаление или CASCADE

Каскадное удаление позволит вам одновременно удалить строки из главной таблицы, а вместе с ними удалить все связанные строки в других таблицах. Задается каскадное удаление таким запросом:

CREATE TABLE Orders( Id INT PRIMARY KEY AUTO_INCREMENT, CustomerId INT, CreatedAt Date, FOREIGN KEY (CustomerId) REFERENCES Customers (Id) ON DELETE CASCADE); 

Аналогично работает метод ON UPDATE CASCADE. При попытке изменить значение, записанное в поле первичного ключа, изменение будет применено к внешнему ключу, связанному с данным полем. Этот метод используется крайне редко, так как первичные ключи практически не являются изменяемыми полями.

RESTRICT

Опция RESTRICT позволяет отклонять все запросы на изменение или удаление строк в главной таблице при условии, что в связанной таблице также имеются строки. Задается данное ограничение следующим запросом:

CREATE TABLE Orders( Id INT PRIMARY KEY AUTO_INCREMENT, Customer_Id INT, CreatedAt Date, FOREIGN KEY (Customer_Id) REFERENCES Customers (Id) ON DELETE RESTRICT); 

Заключение

В данной статье мы рассмотрели что такое первичный и внешний ключи SQL, зачем они нужны и как их создать различными способами: при создании таблицы или при помощи ALTER TABLE. Также мы рассмотрели несколько сценариев использования внешнего ключа для управления таблицами.

Как установить и использовать MySQL Workbench

Для чего нужен составной ключ в mysql?

Для чего нужен составной ключ в mysql? Можете пожалуйста объяснить и привести понятный пример, в котором можно увидеть необходимость использования составного ключа.

  • Вопрос задан более трёх лет назад
  • 19865 просмотров

1 комментарий

Простой 1 комментарий

delphinpro

Сергей delphinpro @delphinpro

Есть таблица статистики.
Поля

date user и другие. 18.01 cat 18.01 dog 19.01 cat 19.01 dog . 

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

5c4335ad74c88236761276.png

Решения вопроса 1

flapflapjack

Талян @flapflapjack
на треть я прав

У меня например есть таблица «права доступа».

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

Потому я использую двойной ключ (user_id,access_mode)

Ответ написан более трёх лет назад
Нравится 3 9 комментариев
Артём @danyvasnafig Автор вопроса

Так может быть таблица права доступа и таблица юзера, и в таблице права доступа внешний ключ на юзера, из таблицы юзеров,не?

flapflapjack

Талян @flapflapjack

Артём, права разные есть. Для каждого пользователя может быть скольугодно разных прав.

Список прав хранится в другой таблице, и может меняться.

users (id,name)
access_modes (id,access_name)
access (user_id,access_mode_id)

access_modes:
1|может менять новости
2|может редактировать главную страницу
3|может удалять аккаунт
4|может забанить

Артём @danyvasnafig Автор вопроса
Анатолий Цивилёв, все, теперь все стало на свои места, спасибо

alekciy

Анатолий Цивилёв А каким образом составной ключ связан с уникальностью? В данном контексте вопроса. Может ли составной ключ быть не уникальным?

flapflapjack

Талян @flapflapjack

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

alekciy

>Нет, не может.
Т.е. я не могу создать не уникальный составной ключ (индекс), так?

flapflapjack

Талян @flapflapjack
Алексей Сундуков, так. Будет ошибка

alekciy

CREATE TABLE IF NOT EXISTS `test` ( `field1` int(11) NOT NULL, `field2` int(11) NOT NULL, KEY `index_test` (`field1`,`field2`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; INSERT INTO `test` (`field1`, `field2`) VALUES (1, 1), (1, 1);

alekciy

Анатолий Цивилёв, Я это к чему. Нет связи между тем, составной индекс или нет и уникальный он или нет. Это теплое и мягкое и ни как это категории не сцеплены. Точно так же как не сцеплено создание ключей и fk в некоторых реализациях РСУБД.

Поэтому не стоит вводить в заблуждение автора и других читателей.

Ответы на вопрос 4

Составные ключи могут служить заменой специально вводимым идентификаторам.
Например есть таблица Пользователи вида Users(id, name) и таблица Фотки вида Photos(id, name).

Таблица содержащая фотки пользователей будет таблица UsersPhotos(user_id, photo_id). В данном случае эти два поля образуют составной ключ, эта связка будет уникальна и нет смысла вводить избыточный идентификатор, если этого не требует логика приложения.

Ответ написан более трёх лет назад
Нравится 5 7 комментариев
Артём @danyvasnafig Автор вопроса

вот я и не понимаю, проще же создать как и написано выше внешний ключ user_id в таблице Photos и через него связать с таблицей Users. Это разве не проще, чем создавать отдельную таблицу с таким составным ключом?

flapflapjack

Талян @flapflapjack

Артём, это всего лишь абстрактный пример, как может использоваться.

Ниже я написал, как это используется у меня. Тут вы уже не засунете в таблицу users все их права.

Таблица содержащая фотки пользователей будет таблица UsersPhotos(user_id, photo_id). В данном случае эти два поля образуют составной ключ, эта связка будет уникальна и нет смысла вводить избыточный идентификатор, если этого не требует логика приложения.

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

вот я и не понимаю, проще же создать как и написано выше внешний ключ user_id в таблице Photos и через него связать с таблицей Users. Это разве не проще, чем создавать отдельную таблицу с таким составным ключом?

В данном случае — да, конечно.
luna3956 привел вам другую ситуацию.

Артём, смотрите, есть связи вида один ко многим и есть связи вида многие ко многим. Если сделать так: Photos(id, name, user_id) — это будет связь один ко многим, то есть одна картинка/фотка привязана только к одному пользователю(но один и тот же пользователь может быть привязан к множеству картинок). А теперь представьте если нужно обозначить ситуацию, когда одна картинка может иметь отношение не только к одному пользователю, а к большому количеству. Тогда вы уже не сможете указать идентификатор пользователя так Photos(id, name, user_id), вам придется создавать новую таблицу вида, который был указан мною в ответе, и там уже каждая фотография может быть привязана к любому количеству пользователей. А каждая строка в этой новой таблице будет содержать уникальную связку, которая и будет являться составным ключом.

Rsa97

Следовательно, несмотря на то, что ключ здесь составной, но индекс нужен по user_id

Первичный ключ (user_id, photo_id) одновременно обеспечит уникальность пары и будет работать как индекс по user_id.

Артём @danyvasnafig Автор вопроса
всем спасибо, разобрался

Если ключ primary, то, как уже ответили, чтобы использовать уникальную комбинацию полей вместо auto_increment.
А если речь идёт об индексе, то mysql не умеет их комбинировать. Соответственно, если вам нужна фильтрация, например, по тэгу статьи и дате публикации, и это частый запрос, то вам придётся добавить составной индекс. Причём, порядок имеет значение — key(tag_id, tm) не будет использоваться в запросах с tm, но без tag_id в where.

Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать

alekciy

Вёбных дел мастер

Составной ключ (индекс) нужен как и все индексы для ускорения выборки. Его можно не использовать и для каждого поля создать свой, но работать они будут медленее, чем составной и будет больше оверхеда на их поддержку.
Т.е. составной ключ нужен если у вас много выборок вида Поле1->Поле2->Поле3. При этом как уже отметил kilgur порядок полей имеет значение и работать будет быстро только префиксный вариант.

Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
разработчик на FPGA, программист, учитель

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

А если мы имеет таблицу many-to-many, которая сопоставляет две других таблицы с естественными ключами, и выбрали для many-to-many составной ключ, являющийся, таким образом, комбинацией двух естественных ключей, то иногда получается вообще избавиться от лишнего JOIN при запросе, что очень неплохо, потому что самая важная информация уже есть в самом ключе.

Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

mysql

  • MySQL

Как удалить запись в таблице MySQL по трём параметрам?

  • 1 подписчик
  • 01 мар.
  • 215 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *