Restrição PRIMARY KEY |
A restrição PRIMARY KEY impõe que a coluna ou combinação de colunas tenha valores únicos para todas as linhas da tabela, não podendo receber valores NULL. Cada tabela só pode ter uma restrição deste tipo. As boas práticas de modelação de dados recomendam que todas as tabelas tenham uma PRIMARY KEY, embora a base de dados não obrigue a que esta seja criada.
Para implementar esta restrição a base de dados cria um índice, que por omissão tem o mesmo nome da restrição e fica armazenado no mesmo tablespace da tabela. É possível alterar o nome assim como o tablespace, mas isso está fora do âmbito deste curso.
A definição da restrição pode ser feita usando uma das duas sintaxes abaixo:
Tipo | Sintaxe |
Coluna (só é abrangida uma coluna) |
CONSTRAINT nome PRIMARY KEY |
Tabela (são abrangidas várias colunas) |
, CONSTRAINT nome PRIMARY KEY (coluna1, coluna2,...) (atenção à colocação da virgula) |
No exemplo abaixo todas as tabelas recebem uma restrição PRIMARY KEY usando a sintaxe de tabela:
create table EQUIPA ( ID_EQUIPA NUMBER(10,0) not null, NOME VARCHAR2(100) constraint nn_equipa_nome not null, constraint PK_EQUIPA primary key (ID_EQUIPA) ); 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) ); create table JOGO ( EQUIPA_CASA NUMBER(10,0) not null, EQUIPA_VISITANTE NUMBER(10,0) not null, DATA DATE not null, LOCAL VARCHAR2(100) default 'Estádio Alvalade XXI' not null, RISCO_SEGURANCA VARCHAR(100) not null, constraint PK_JOGO primary key (EQUIPA_CASA, EQUIPA_VISITANTE, DATA), constraint FK_JOGO_REF_EQUIPA_CASA foreign key (EQUIPA_CASA) references EQUIPA (ID_EQUIPA), constraint FK_JOGO_REF_EQUIPA_VISITANTE foreign key (EQUIPA_VISITANTE) references EQUIPA (ID_EQUIPA), constraint CK_JOGO_01 check (risco_seguranca in ('Alto','Medio','Baixo') and equipa_casa != equipa_visitante) ); create table CONTRATADO ( ID_JOGADOR NUMBER(10,0) not null, ID_EQUIPA NUMBER(10,0) not null, DATA_INICIO DATE not null, DATA_FIM DATE not null, constraint PK_CONTRATADO primary key (ID_JOGADOR, ID_EQUIPA, DATA_INICIO), constraint FK_CONTRATA_REFERENCE_JOGADOR foreign key (ID_JOGADOR) references JOGADOR (ID_JOGADOR), constraint FK_CONTRATA_REFERENCE_EQUIPA foreign key (ID_EQUIPA) references EQUIPA (ID_EQUIPA), constraint CKT_CONTRATADO check (data_inicio < data_fim) ); |
O comando abaixo consulta o dicionário de dados para ver a restrição PRIMARY KEY criada sobre a tabela CONTRATADO:
select * from user_constraints where table_name = 'CONTRATADO' and constraint_type = 'P' |
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 PK_CONTRATADO P CONTRATADO ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED USER NAME 06.06.29 HR PK_CONTRATADO 1 rows selected |
O comando abaixo remove a restrição PK listada acima e recria-a usando uma sintaxe de tabela:
alter table CONTRATADO drop constraint PK_CONTRATADO; alter table CONTRATADO add constraint PK_CONTRATADO primary key (ID_JOGADOR, ID_EQUIPA, DATA_INICIO); |
alter table CONTRATADO succeeded. alter table CONTRATADO succeeded. |
O comando abaixo tenta remover a PRIMARY KEY definida sobre a tabela EQUIPA:
alter table EQUIPA drop constraint PK_EQUIPA; |
Error starting at line 1 in command: alter table EQUIPA drop constraint PK_EQUIPA Error report: SQL Error: ORA-02273: this unique/primary key is referenced by some foreign keys |
O exemplo abaixo mostra como definir as restrições PRIMARY KEY para as tabelas EQUIPA e JOGADOR usando sintaxe de coluna:
create table EQUIPA ( ID_EQUIPA NUMBER(10,0) constraint PK_EQUIPA primary key, NOME VARCHAR2(100) constraint nn_equipa_nome not null ); create table JOGADOR ( ID_JOGADOR NUMBER(10,0) constraint PK_JOGADOR primary key, NOME varchar2(100) not null, POSICAO varchar2(100) not null, BI VARCHAR(100), constraint UK_JOGADOR unique (BI) ); |
O comando abaixo mostra como adicionar uma restrição PRIMARY KEY a uma tabela já existente usando uma sintaxe de coluna. Partindo do principio que a tabela EQUIPA não existe, vamos criá-la e em seguida adicionar a restrição:
create table EQUIPA ( ID_EQUIPA NUMBER(10,0) not null, NOME VARCHAR2(100) constraint nn_equipa_nome not null ); alter table EQUIPA modify (ID_EQUIPA constraint PK_EQUIPA primary key); |
Realizado por Turtle Learning ®. Última alteração em 2011-08-14