Olá galera o/

Continuando nossa série de postagens sobre as restrições de domínio vulgo constraints, hoje abordaremos sobre a Unique.

Let’s go para nosso terceiro episódio Guys!!!

O que é a Constraint Unique?

Restrição que garante que um determinado valor não se repita na coluna com a regra aplicada, ou seja, só poderá acontecer uma ocorrência daquele valor naquela coluna.

Obs.1: A restrição PRIMARY KEY possui uma restrição UNIQUE implícita.

Obs.2: Em uma tabela pode haver várias restrições Unique aplicada a várias colunas, porém, somente uma restrição PK por tabela.

Obs.3: Ele cria um índice não clusterizado na tabela.

Obs.4: A coluna com essa restrição pode aceitar apenas um valor nulo (NULL).

Boa prática!

Analise MUITO bem quais colunas vão ter essa regra aplicada, pois, aplicar em colunas aleatoriamente pode atrapalhar muito a manipulação dos dados na tabela. Então, tenham bastante CUIDADO.

Para facilitar o entendimento, unificaremos a nomenclatura tudo que for referente a atributo, coluna ou campo, utilizaremos a palavra coluna (Column).

Praticando a criação da constraint Unique!

A partir de agora, começaremos a praticar a criação da constraint Unique.

1 – Criando tabelas com Unique – Definição no create table

1.1 – Criaremos uma tabela chamada TB_UNIQUE com 3 colunas. Uma das colunas será chamada de COLUNA_CONSTRAINT e receberá a constraint UNIQUE. Percebam que, na pasta keys da tabela TB_UNIQUE foi criada uma constraint chamada UQ_CONSTRAINT referenciando a restrição.

Sintaxe da atribução da Unique:

Sem nome da constraint:
– coluna TIPO UNIQUE

Com nome da constraint:
– coluna TIPO CONSTRAINT nome_constraint UNIQUE

-- maneira 01
CREATE TABLE TB_UNIQUE(
CODIGO INT PRIMARY KEY, 
NOME VARCHAR(50), 
COLUNA_CONSTRAINT CHAR(1) CONSTRAINT UQ_CONSTRAINT UNIQUE 
)

ou

-- maneira 02
CREATE TABLE TB_UNIQUE(
CODIGO INT PRIMARY KEY, 
NOME VARCHAR(50), 
COLUNA_CONSTRAINT CHAR(1) UNIQUE 
)

2.2 – Iremos inserir 3 registros nas tabelas TB_UNIQUE, ao inserir os registros, devemos consultar a tabela.

INSERT INTO TB_UNIQUE (CODIGO, NOME, COLUNA_CONSTRAINT)
VALUES
	(1, 'JOANA', 'A'),
	(2, 'MARIA', 'B'),
	(3, 'ANA', 'C')


SELECT * FROM TB_UNIQUE

2.3 – Agora iremos inserir mais 1 registro na tabela TB_UNIQUE passando o valor NULL para a coluna COLUNA_CONSTRAINT. Lembrando que, quando atribuímos uma coluna como Unique, o valor NULL só pode ser atribuído uma única vez para um único registro na tabela toda.

INSERT INTO TB_UNIQUE (CODIGO, NOME, COLUNA_CONSTRAINT)
VALUES
	(4, 'CARLOS', NULL)

SELECT * FROM TB_UNIQUE

2 – Tentando inserir valor duplicado na coluna com restrição Unique

2.1 – Tentaremos inserir um novo registro passando como valor a letra ‘A’ na coluna COLUNA_CONSTRAINT. Será apresentado um erro informando que o valor da letra ‘A’ já foi atribuído a outro registro, ou seja, isso torna esse valor único na tabela e não pode ser mais usado por outro registro.

INSERT INTO TB_UNIQUE (CODIGO, NOME, COLUNA_CONSTRAINT)
VALUES
	(5, 'FELIPE', 'A')

2.2 – Tentaremos inserir um novo registro passando o valor NULL na coluna COLUNA_CONSTRAINT. Será apresentado um erro informando que o valor NULL já foi atribuído a outro registro, ou seja, isso torna esse valor único na tabela e não pode ser mais usado por outro registro.

INSERT INTO TB_UNIQUE (CODIGO, NOME, COLUNA_CONSTRAINT)
VALUES
	(5, 'FELIPE', NULL)

2.3 – Para resolver esta inconsistência, precisamos atribuir um novo valor para a coluna COLUNA_CONSTRAINT. Passamos como valor a letra ‘D’, percebam que, o registro foi inserido com sucesso.

3 – Adicionando UNIQUE depois de uma tabela já criada.

3.1 – Criaremos uma tabela nova chamada TB_UNIQUE2 com as mesmas 3 colunas da tabela TB_UNIQUE. A única diferença é que, a coluna COLUNA_CONSTRAINT não receberá nenhuma constraint do tipo UNIQUE.

CREATE TABLE TB_UNIQUE2(
CODIGO INT PRIMARY KEY, 
NOME VARCHAR(50), 
COLUNA_CONSTRAINT CHAR(1)
)

3.2 – Caso queira adicionar uma constraint UNIQUE em uma tabela já existente, é necessário alterar a estrutura da tabela e adicionar a restrição na coluna desejada conforme o código abaixo.

--metodo 1
ALTER TABLE TB_UNIQUE2
ADD UNIQUE (COLUNA_CONSTRAINT)

ou

--metodo 2
ALTER TABLE TB_UNIQUE2
ADD CONSTRAINT UQ_CONSTRAINT2 UNIQUE (COLUNA_CONSTRAINT)

3.3 – Caso queira apagar a constraint criada pelo SGBD ou definida por você no momento da criação do código, será necessário alterar a estrutura e utilizar as clausulas DROP CONSTRAINT + nome da constraint. Para pegar o nome da constraint criada pelo SGBD, vá até à pasta Keys que está contida na tabela TB_UNIQUE2, copie o nome e cole após a clausula DROP CONSTRAINT.

ALTER TABLE TB_UNIQUE2
DROP CONSTRAINT UQ__TB_UNIQU__2CF1A6857FC8740D;

3.4 – Execute o comando. Percebam que, a constraint UNIQUE sumiu da pasta keys, ou seja, a coluna não possui mais a restrição de valor único na tabela.

3.5 – Ao tentar adicionar uma constraint UNIQUE em uma coluna que já possui valores repetidos, uma mensagem de erro será apresentada, informando que a coluna em questão já possui valores duplicados e que não será possível adicionar a constraint UNIQUE. Tentem inserir 2 registros com valores iguais para a coluna COLUNA_CONSTRAINT na tabela TB_UNIQUE2, uma vez que, os registros foram inseridos, tente novamente inserir a constraint nesta coluna. Como explicado anteriormente, um erro será apresentado.

INSERT INTO TB_UNIQUE2 (CODIGO, NOME, COLUNA_CONSTRAINT)
VALUES 
	(1,'A','A'),
	(2,'B','A')


ALTER TABLE TB_UNIQUE2
ADD UNIQUE (COLUNA_CONSTRAINT)

5 – Considerações Finais

No episódio 03 aprendemos um pouco sobre a constraint Unique, como criar uma tabela com unique, como adicionar uma Unique em uma tabela já existente, o que acontece quando tentamos adicionar a constraint na coluna com valores duplicados, e além de tudo, como apagar a mesma.

Este é o terceiro de 6 posts sobre as constraints, fiquem atentos aos próximos episódios dessa série.

Espero que tenham gostado pessoal, boa leitura e bons estudos!

Quem quiser mandar comentários, sugestões, críticas ou dicas complementares, fiquem a vontade, pois feedbacks positivos ou negativos engradecem meu conhecimento para poder melhorar as postagens para vocês.

Até a próxima o/

Acessem nossas Redes Sociais: