Поделиться через


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

Область применения: SQL Server 2016 (13.x) и более поздних версий База данных SQL Azure Управляемый экземпляр SQL Azure

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

Примеры кода Transact-SQL в этой статье используют AdventureWorks2022 базу данных или AdventureWorksDW2022 пример базы данных, которую можно скачать с домашней страницы примеров и проектов сообщества Microsoft SQL Server.

Ограничения

Таблица может содержать только одно PRIMARY KEY ограничение.

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

Разрешения

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

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

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

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

Внимание

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. Создайте таблицу для добавления кластеризованного индекса.

    CREATE TABLE [Production].[TransactionHistoryArchive1] (
        CustomerID UNIQUEIDENTIFIER DEFAULT NEWSEQUENTIALID(),
        TransactionID INT IDENTITY(1, 1) NOT NULL,
        CONSTRAINT PK_TransactionHistoryArchive1_CustomerID PRIMARY KEY NONCLUSTERED (CustomerID)
    );
    
  2. Теперь добавьте кластеризованный индекс.

    CREATE CLUSTERED INDEX CIX_TransactionID
    ON [Production].[TransactionHistoryArchive1] (TransactionID);