A linguagem SQL > DDL > Tabelas > Restrição UNIQUE
Restrição UNIQUE logotipo.gif

A restrição UNIQUE garante que o conteúdo da coluna (ou combinação de colunas) assume um valor diferente para cada linha da tabela. Neste caso a coluna ou combinação de colunas constituem uma UNIQUE KEY ou ALTERNATE KEY (identificador alternativo).

Uma UNIQUE KEY distingue-se de uma PRIMARY KEY (chave primária) pelos seguintes factores:

São candidatos a UNIQUE KEY campos que possam receber NULL embora tenham valor único para todas as linhas da tabela quando não são NULL. Por exemplo, numa tabela de ALUNOS, o campo BI (Número de Bilhete de Identidade), o campo NIF (Número de identificação FISCAL) ou o campo EMAIL.

Por cada restrição UNIQUE a base de dados cria um índice que permitirá fazer a validação da restrição. Por omissão este índice terá o mesmo nome que a restrição e será criado no mesmo tablespace. É possível forçar a criação do índice noutro tablespace, mas a forma de o fazer ultrapassa o objetivo deste curso. A criação de um índice aporta um peso adicional em termos de processamento e acesso a disco cada vez que se faz um INSERT ou UPDATE na tabela.

Uma restrição UNIQUE pode ser criada usando dois tipos de sintaxe:

Tipo Sintaxe
Coluna
(só é abrangida uma coluna)
CONSTRAINT nome UNIQUE
Tabela
(são abrangidas várias colunas)
, CONSTRAINT nome UNIQUE (coluna1, coluna2, ...)
(atenção à colocação da virgula)

A UNIQUE KEY pode ser utilizada para implementar algumas "regras de negócio", como por exemplo: "assegurar que nunca existem dois nomes de departamento idênticos no mesmo local". A sua implementação na tabela DEPT está descrita no comando abaixo:

create table DEPT (
   deptno number,
   dname   varchar2(9) constraint dname_cons not null,
   loc     varchar2(10) constraint loc_cons not null,
   CONSTRAINT UK_DEPT_LOC UNIQUE (DNAME,LOC)
);

note04.gif

No exemplo abaixo removemos a restrição:

alter table DEPT drop constraint UK_DEPT_LOC;

No exemplo abaixo alteramos a tabela para adicionar a restrição:

alter table DEPT add constraint UK_DEPT_LOC unique (DNAME,LOC) enable;

No exemplo abaixo a coluna BI (Número de Bilhete de Identidade) recebe a restrição UNIQUE, o que garante a não repetição de BI's e possibilita simultâneamente a existencia de linhas com BI desconhecido (NULL):

create table JOGADOR  (
   ID_JOGADOR           NUMBER(10,0)                    not null,
   NOME                 varchar2(100)                   not null,
   POSICAO              varchar2(100)                   not null,
   BI                   VARCHAR(100),
   constraint PK_JOGADOR primary key (ID_JOGADOR),
   constraint UK_JOGADOR unique (BI)
);

No exemplo anterior a restrição UNIQUE foi definida como uma restrição de tabela. Como neste caso só é abrangida uma coluna é possível defini-la como uma restrição de coluna. A sintaxe seria a seguinte:

create table JOGADOR  (
   ID_JOGADOR           NUMBER(10,0)                    not null,
   NOME                 varchar2(100)                   not null,
   POSICAO              varchar2(100)                   not null,
   BI                   VARCHAR(100) constraint AK_KEY_2_JOGADOR unique ,
   constraint PK_JOGADOR primary key (ID_JOGADOR)
);

O query abaixo faz uma consulta ao dicionário de dados para listar as restrições do tipo UNIQUE existentes na tabela JOGADOR:

select * 
from user_constraints
where constraint_type = 'U' 
and table_name = 'JOGADOR';
OWNER                          CONSTRAINT_NAME                CONSTRAINT_TYPE TABLE_NAME                     SEARCH_CONDITION R_OWNER                        R_CONSTRAINT_NAME              DELETE_RULE STATUS   DEFERRABLE     DEFERRED  VALIDATED     GENERATED      BAD RELY LAST_CHANGE               INDEX_OWNER                    INDEX_NAME                     INVALID VIEW_RELATED   
------------------------------ ------------------------------ --------------- ------------------------------ ---------------- ------------------------------ ------------------------------ ----------- -------- -------------- --------- ------------- -------------- --- ---- ------------------------- ------------------------------ ------------------------------ ------- -------------- 
HR                             UK_JOGADOR                     U               JOGADOR                                                                                                                   ENABLED  NOT DEFERRABLE IMMEDIATE VALIDATED     USER NAME               06.06.26                  HR                             UK_JOGADOR                                            

1 rows selected

bthome.gifTopo


Realizado por Jose Aser Lorenzo. Última alteração em 2011-08-14