A linguagem SQL > DDL > Tabelas > Restrição PRIMARY KEY
Restrição PRIMARY KEY tl_logo2.jpg

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)
);

note04.gif

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:

sentidoproib.gif
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

note04.gif

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);

bthome.gifTopo


Realizado por Turtle Learning ®. Última alteração em 2011-08-14