SQL Server UNIQUE Constraint (Português)

Summary: neste tutorial, aprenderá como utilizar o SQL Server UNIQUE constraint para assegurar a singularidade dos dados contidos numa coluna ou num grupo de colunas.

Introdução ao SQL Server UNIQUE constraint

SQL Server UNIQUE constraints permitem-lhe assegurar que os dados armazenados numa coluna, ou num grupo de colunas, são únicos entre as linhas de uma tabela.

A seguinte declaração cria uma tabela cujos dados na tabela email são únicos entre as linhas da tabela hr.persons:

CREATE SCHEMA hr;GOCREATE TABLE hr.persons( person_id INT IDENTITY PRIMARY KEY, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, email VARCHAR(255) UNIQUE);
Code language: SQL (Structured Query Language) (sql)

Nesta sintaxe, define-se a restrição UNIQUE como uma restrição de coluna. Também se pode definir a restrição UNIQUE como uma restrição de tabela, desta forma:

CREATE TABLE hr.persons( person_id INT IDENTITY PRIMARY KEY, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, email VARCHAR(255), UNIQUE(email));
Code language: SQL (Structured Query Language) (sql)

nos bastidores, o SQL Server cria automaticamente uma restrição UNIQUE índice para impor a singularidade dos dados armazenados nas colunas que participam na restrição UNIQUE. Portanto, se tentar inserir uma linha duplicada, o SQL Server rejeita a alteração e devolve uma mensagem de erro indicando que o UNIQUE constraint foi violado.

A seguinte declaração insere uma nova linha no hr.persons tabela:

INSERT INTO hr.persons(first_name, last_name, email)VALUES('John','Doe','[email protected]');
Code language: SQL (Structured Query Language) (sql)

A declaração funciona como esperado. Contudo, a seguinte declaração falha devido ao e-mail duplicado:

INSERT INTO hr.persons(first_name, last_name, email)VALUES('Jane','Doe','[email protected]');
Code language: SQL (Structured Query Language) (sql)

SQL Server emitiu a seguinte mensagem de erro:

Violation of UNIQUE KEY constraint 'UQ__persons__AB6E616417240E4E'. Cannot insert duplicate key in object 'hr.persons'. The duplicate key value is ([email protected]).
Code language: Shell Session (shell)

Se não especificar um nome separado para o UNIQUE constraint, o SQL Server gerará automaticamente um nome para ele. Neste exemplo, o nome da restrição é UQ__persons__AB6E616417240E4E, que não é bem legível.

Para atribuir um nome particular a um UNIQUE constraint, utiliza-se a palavra-chave CONSTRAINT como se segue:

CREATE TABLE hr.persons ( person_id INT IDENTITY PRIMARY KEY, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, email VARCHAR(255), CONSTRAINT unique_email UNIQUE(email));
Code language: SQL (Structured Query Language) (sql)

As seguintes são as vantagens de atribuir um UNIQUE constraint a specific name:

  • It easier to classify the error message.
  • Pode referenciar o nome da restrição quando quiser modificá-lo.

restrição UNIQUE vs. PRIMARY KEY constraint

Although both UNIQUE and PRIMARY KEY constraints enforce the uniqueness of data, deve usar o UNIQUE constraint em vez de PRIMARY KEY constraint quando pretende impor a singularidade de uma coluna, ou de um grupo de colunas, que não são as colunas chave primárias.

Diferente de PRIMARY KEY constrangimentos, UNIQUE constrangimentos permitem NULL. Além disso, UNIQUE restrições permitem NULL como um valor regular, portanto, só permite um NULL por coluna.

A seguinte afirmação insere uma linha cujo valor na coluna emailNULL:

INSERT INTO hr.persons(first_name, last_name)VALUES('John','Smith');
Code language: SQL (Structured Query Language) (sql)

Agora, se tentar inserir mais um NULL na coluna email, receberá um erro:

INSERT INTO hr.persons(first_name, last_name)VALUES('Lily','Bush');
Code language: SQL (Structured Query Language) (sql)

Aqui está a saída:

Violation of UNIQUE KEY constraint 'UQ__persons__AB6E616417240E4E'. Cannot insert duplicate key in object 'hr.persons'. The duplicate key value is (<NULL>).
Code language: SQL (Structured Query Language) (sql)

Restrições únicas para um grupo de colunas

Para definir uma restrição UNIQUE para um grupo de colunas, escreva-a como uma restrição de tabela com os nomes das colunas separados por vírgulas, como se segue:

CREATE TABLE table_name ( key_column data_type PRIMARY KEY, column1 data_type, column2 data_type, column3 data_type, ..., UNIQUE (column1,column2));
Code language: SQL (Structured Query Language) (sql)

O exemplo seguinte cria uma restrição UNIQUE que consiste em duas colunas person_id e skill_id:

CREATE TABLE hr.person_skills ( id INT IDENTITY PRIMARY KEY, person_id int, skill_id int, updated_at DATETIME, UNIQUE (person_id, skill_id));
Code language: SQL (Structured Query Language) (sql)

Adicionar restrições UNIQUE às colunas existentes

Quando se adiciona uma restrição UNIQUE a uma coluna existente ou a um grupo de colunas numa tabela, o SQL Server examina primeiro os dados existentes nestas colunas para assegurar que todos os valores são únicos. Se o SQL Server encontrar os valores duplicados, então devolve um erro e não adiciona o UNIQUE constraint.

O seguinte mostra a sintaxe da adição de um UNIQUE constraint a uma tabela:

ALTER TABLE table_nameADD CONSTRAINT constraint_name UNIQUE(column1, column2,...);
Code language: SQL (Structured Query Language) (sql)

Se tiver a seguinte tabela hr.persons:

CREATE TABLE hr.persons ( person_id INT IDENTITY PRIMARY KEY, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, email VARCHAR(255), phone VARCHAR(20),);
Code language: SQL (Structured Query Language) (sql)

A seguinte declaração adiciona um UNIQUE constrangimento à coluna email:

ALTER TABLE hr.personsADD CONSTRAINT unique_email UNIQUE(email);
Code language: SQL (Structured Query Language) (sql)

Simplesmente, a seguinte declaração adiciona um UNIQUE constrangimento à coluna do telefone:

ALTER TABLE hr.personsADD CONSTRAINT unique_phone UNIQUE(phone);
Code language: SQL (Structured Query Language) (sql)

Delete UNIQUE constraints

Para definir um UNIQUE constraint, usa-se a declaração ALTER TABLE DROP CONSTRAINT como se segue:

ALTER TABLE table_nameDROP CONSTRAINT constraint_name;
Code language: SQL (Structured Query Language) (sql)

A seguinte declaração remove a restrição unique_phone da hr.person table:

ALTER TABLE hr.personsDROP CONSTRAINT unique_phone;
Code language: SQL (Structured Query Language) (sql)

Modificar restrições UNIQUE

ServidorSQL não tem nenhuma declaração directa para modificar uma restrição UNIQUE, portanto, é necessário abandonar primeiro a restrição e recriá-la se quiser alterar a restrição.

Neste tutorial, aprendeu como utilizar o SQL Server UNIQUE constraint para se certificar de que os dados contidos numa coluna ou num grupo de colunas são únicos.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *