Criar chaves primárias

Aplica-se a: SQL Server 2016 (13.x) e posteriores Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure

Você pode definir uma chave primária no mecanismo de banco de dados do SQL Server usando o SQL Server Management Studio ou o Transact-SQL. Criar uma chave primária cria automaticamente um índice clusterizado correspondente exclusivo. No entanto, a chave primária pode ser especificada como um índice não clusterizado.

Os exemplos de código do Transact-SQL deste artigo usa o banco de dados de exemplo AdventureWorks2022 ou AdventureWorksDW2022, que pode ser baixado da home page Microsoft SQL Server Samples and Community Projects.

Limitações

Uma tabela pode conter apenas uma restrição PRIMARY KEY.

Todas as colunas definidas em uma restrição PRIMARY KEY devem ser definidas como NOT NULL. Se a nulidade não for especificada, todas as colunas participantes de uma restrição PRIMARY KEY deverão ter a nulidade definida como NOT NULL.

Permissões

A criação de uma nova tabela com uma chave primária requer a permissão CREATE TABLE no banco de dados e a permissão ALTER no esquema no qual a tabela está sendo criada.

Criar uma chave primária em uma tabela existente requer a permissão ALTER na tabela.

Usar o SQL Server Management Studio

  1. No Pesquisador de Objetos, clique com o botão direito do mouse na tabela à qual você deseja adicionar uma restrição exclusiva e selecione Design.
  2. No Designer de Tabela, selecione o seletor de linha para a coluna de banco de dados que você deseja definir como a chave primária. Se desejar selecionar colunas múltiplas, mantenha pressionada a tecla CTRL enquanto seleciona os seletores de linha para as outras colunas.
  3. Clique com o botão direito do mouse no seletor de linha da coluna e selecione Definir Chave Primária.

Cuidado

Se você quiser redefinir a chave primária, qualquer relação com a chave primária existente deve ser excluída antes que a nova chave primária seja criada. Uma mensagem avisará que as relações existentes serão excluídas automaticamente como parte desse processo.

Uma coluna de chave primária é identificada por um símbolo de chave primária em seu seletor de linha.

Se uma chave primária consistir em mais de uma coluna, serão permitidos valores duplicados em uma coluna, mas cada combinação de valores de todas as colunas na chave primária deve ser única.

Se você definir uma chave combinada, a ordem das colunas na chave primária corresponderá à ordem das colunas, como é mostrado na tabela. Entretanto, você poderá alterar a ordem de colunas depois que a chave primária for criada. Para obter mais informações, veja Modificar chaves primárias.

Usar o Transact-SQL

Criar uma chave primária em uma tabela existente

O exemplo a seguir cria uma chave primária na coluna TransactionID do banco de dados do AdventureWorks2022.

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

Criar uma chave primária em uma nova tabela

O exemplo a seguir cria uma tabela e define uma chave primária na coluna TransactionID do banco de dados do AdventureWorks2022.

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

Criar uma chave primária não clusterizada com um índice clusterizado separado em uma nova tabela

O exemplo a seguir cria uma tabela no banco de dados do AdventureWorks2022 com uma chave primária não clusterizada na coluna CustomerID. Em seguida, ele adiciona um índice clusterizado no TransactionID.

  1. Crie uma tabela para adicionar o índice clusterizado.

    CREATE TABLE [Production].[TransactionHistoryArchive1] (
        CustomerID UNIQUEIDENTIFIER DEFAULT NEWSEQUENTIALID(),
        TransactionID INT IDENTITY(1, 1) NOT NULL,
        CONSTRAINT PK_TransactionHistoryArchive1_CustomerID PRIMARY KEY NONCLUSTERED (CustomerID)
    );
    
  2. Adicione o índice clusterizado.

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