Trabalhando com chaves primárias (primary key) no PostgreSQL

Chaves primárias (ou primary keys) são utilizadas para definir um campo de valor único e não nulo, que servirá como identificador de registros de uma determinada tabela. Geralmente são utilizados usados para relacionamentos entre tabelas ou para identificar um dado chave para o tipo de registro a ser inserido.

As chaves primárias podem ser definidas por uma única coluna (simples) ou com mais de uma coluna (composta).

Exemplo de criação de chave primária simples:

CREATE TABLE cliente (
id_cliente integer <strong>PRIMARY KEY</strong>,
nome text,
idade integer
);

Exemplo de criação de chave primária composta:

CREATE TABLE cliente (
nome varchar,
email varchar,
idade integer,
PRIMARY KEY (nome, email)
);

Exemplo prático

Vamos supor que possuímos uma tabela cliente, como na imagem abaixo:

tabela-cliente

Exemplo do modelo da tabela cliente

Observe que temos um campo destacado com uma chave (id_cliente) que representa nossa chave primária. Nesse modelo estamos assumindo que para o objeto cliente possuímos um registro de ID único para cada registro. O código (PK) ao lado do nome do campo indica que vamos criar uma constraint do tipo chave primária (primary key), como podemos ver no script abaixo:

ALTER TABLE cliente ADD CONSTRAINT pk_cliente PRIMARY KEY (id_cliente);

Observe também que o campo id_cliente é do tipo Serial. Caso ainda não esteja familiarizado com esse tipo de recurso, visite nosso artigo falando sobre como criar um campo auto-increment no PostgreSQL.

Prosseguindo ao nosso exemplo, vamos supor que precisemos criar uma tabela de endereços relacionada à nossa tabela cliente. Poderíamos apenas colocar os campos referentes ao endereço em nossa tabela cliente, mas ficaríamos restritos a um único endereço por cliente. Com uma tabela relacionada, podemos simular um relacionamento de N pra 1, ou seja, N endereços para 1 cliente.

modelo-cliente-endereco

Exemplo de relacionamento entre tabela cliente e endereco.

Repare também na tabela endereço a chave primária em vermelho, só que nesse caso, temos também uma chave estrangeira (fireign key) no campo endereco.id_cliente junto da nossa chave primária principal (id_endereco). Isso ocorre porque trouxemos a chave primária (primary key) da tabela cliente para a tabela endereco, criando assim uma chave primária (primary key) composta.

No modelo acima utilizamos a chave primária da tabela cliente (id_cliente) como campo estrangeiro na tabela endereco para identificarmos a qual cliente pertence o endereço cadastrado. Criando assim, um relacionamento entre tabelas utilizando chaves primárias e chaves estrangeiras.

O script de criação do nosso modelo ficaria assim:

-- Criacao da tabela cliente
CREATE TABLE cliente
(
  id_cliente serial NOT NULL,
  nome character varying NOT NULL,
  email character varying NOT NULL,
  senha character varying NOT NULL,
  ativo smallint NOT NULL DEFAULT 1,
  data_cadastro timestamp NOT NULL DEFAULT now()
)
WITH (OIDS=FALSE);
 
-- Chave primaria da tabela cliente
ALTER TABLE cliente ADD CONSTRAINT pk_cliente PRIMARY KEY(id_cliente);
 
-- Criacao da tabela endereco
CREATE TABLE endereco
(
  id_endereco serial NOT NULL,
  id_cliente integer NOT NULL,
  rua character varying NOT NULL,
  numero character varying NOT NULL,
  complemento character varying NOT NULL,
  cep character varying NOT NULL,
  cidade character varying NOT NULL,
  estado character varying NOT NULL,
  data_cadastro timestamp NOT NULL DEFAULT now()
)
WITH (OIDS=FALSE);
 
-- Chave primaria da tabela endereco
ALTER TABLE endereco ADD CONSTRAINT pk_endereco PRIMARY KEY(id_endereco, id_cliente);
 
-- Foreign key da tabela endereco com a tabela cliente
ALTER TABLE endereco ADD CONSTRAINT fk_cliente_endereco FOREIGN KEY (id_cliente)
      REFERENCES cliente (id_cliente) MATCH SIMPLE  ON UPDATE NO ACTION ON DELETE NO ACTION;
Bookmark e Compartilhe

junho 22, 2010 · Marcelo Santino · No Comments
Tags: , , ,  Â· Posted in: Banco de Dados, PostgreSQL

Leave a Reply