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 emailNULL:
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.