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
:
Code language: SQL (Structured Query Language) (sql)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);
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:
Code language: SQL (Structured Query Language) (sql)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));
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:
Code language: SQL (Structured Query Language) (sql)INSERT INTO hr.persons(first_name, last_name, email)VALUES('John','Doe','[email protected]');
A declaração funciona como esperado. Contudo, a seguinte declaração falha devido ao e-mail duplicado:
Code language: SQL (Structured Query Language) (sql)INSERT INTO hr.persons(first_name, last_name, email)VALUES('Jane','Doe','[email protected]');
SQL Server emitiu a seguinte mensagem de erro:
Code language: Shell Session (shell)Violation of UNIQUE KEY constraint 'UQ__persons__AB6E616417240E4E'. Cannot insert duplicate key in object 'hr.persons'. The duplicate key value is ([email protected]).
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:
Code language: SQL (Structured Query Language) (sql)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));
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 email
NULL
:
Code language: SQL (Structured Query Language) (sql)INSERT INTO hr.persons(first_name, last_name)VALUES('John','Smith');
Agora, se tentar inserir mais um NULL
na coluna email
, receberá um erro:
Code language: SQL (Structured Query Language) (sql)INSERT INTO hr.persons(first_name, last_name)VALUES('Lily','Bush');
Aqui está a saída:
Code language: SQL (Structured Query Language) (sql)Violation of UNIQUE KEY constraint 'UQ__persons__AB6E616417240E4E'. Cannot insert duplicate key in object 'hr.persons'. The duplicate key value is (<NULL>).
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:
Code language: SQL (Structured Query Language) (sql)CREATE TABLE table_name ( key_column data_type PRIMARY KEY, column1 data_type, column2 data_type, column3 data_type, ..., UNIQUE (column1,column2));
O exemplo seguinte cria uma restrição UNIQUE
que consiste em duas colunas person_id
e skill_id
:
Code language: SQL (Structured Query Language) (sql)CREATE TABLE hr.person_skills ( id INT IDENTITY PRIMARY KEY, person_id int, skill_id int, updated_at DATETIME, UNIQUE (person_id, skill_id));
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:
Code language: SQL (Structured Query Language) (sql)ALTER TABLE table_nameADD CONSTRAINT constraint_name UNIQUE(column1, column2,...);
Se tiver a seguinte tabela hr.persons
:
Code language: SQL (Structured Query Language) (sql)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),);
A seguinte declaração adiciona um UNIQUE
constrangimento à coluna email
:
Code language: SQL (Structured Query Language) (sql)ALTER TABLE hr.personsADD CONSTRAINT unique_email UNIQUE(email);
Simplesmente, a seguinte declaração adiciona um UNIQUE
constrangimento à coluna do telefone:
Code language: SQL (Structured Query Language) (sql)ALTER TABLE hr.personsADD CONSTRAINT unique_phone UNIQUE(phone);
Delete UNIQUE constraints
Para definir um UNIQUE
constraint, usa-se a declaração ALTER TABLE DROP CONSTRAINT
como se segue:
Code language: SQL (Structured Query Language) (sql)ALTER TABLE table_nameDROP CONSTRAINT constraint_name;
A seguinte declaração remove a restrição unique_phone
da hr.person table:
Code language: SQL (Structured Query Language) (sql)ALTER TABLE hr.personsDROP CONSTRAINT unique_phone;
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.