Restrição UNIQUE |
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) ); |
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 |
Realizado por Turtle Learning ®. Última alteração em 2011-08-14