Thursday 21 November 2024

KEY (Chave)

Conjunto de colunas selecionadas para identificar as linhas da tabela. As chaves podem identificar linhas dentro da própria tabela ou linhas de outra tabela (Foreign Keys).

O DB2 aceita os seguintes tipos de KEY:

UNIQUE KEY (Unicidade)

Chave que identifica de maneira inequívoca uma linha da tabela. Não existe mais de uma linha da tabela com a mesma UNIQUE KEY. A UNIQUE KEY tem as seguintes propriedades:

  • A UNIQUE KEY não pode ter NULL (não pode estar vazia).
  • É necessário criar um UNIQUE INDEX para a UNIQUE KEY.
  • Uma tabela pode ter mais de um UNIQUE KEY.

Uma restrição UNIQUE em uma coluna ou grupo de colunas determina que o seu valor deve ser único na tabela. Esse tipo de restrição é usado para chaves alternadas, ou seja, valores que se repetem na tabela além da chave primária. Pode haver várias restrições UNIQUE na tabela e as colunas de uma restrição UNIQUE permitem valores nulos. Esse tipo de restrição pode ser criada com exatamente a mesma sintaxe do PRIMARY KEY, por exemplo (não execute):

alter table Cliente

  add unique nonclustered (CodCliente)

Também é criado um índice automaticamente, que não permite valores duplicados. Pode-se especificar ou não o nome da restrição, na forma CONSTRAINT nome logo antes do "UNIQUE".

 

PRIMARY KEY (Chave primária)

É a UNIQUE KEY usada na definição da tabela. Suas propriedades são:

  • A tabela só pode ter uma PRIMARY KEY.
  • A PRIMARY KEY é opcional, isto é, as tabelas não precisam ter PRIMARY KEY.

A chave primária [primary key] de uma tabela é uma coluna ou seqüência de colunas que identificam unicamente uma linha dentro da tabela, ou seja, seu valor não pode ser repetido para outras linhas. Ao definir uma chave primária, automaticamente é criado um índice na tabela. Só pode haver uma chave primária na tabela. Não se pode entrar com um valor nulo em qualquer coluna de uma chave primária (lembrando que nulo é um valor desconhecido, diferente de 0 ou de espaço em branco). Recomenda-se uma coluna inteira, pequena, como uma chave primária. Na criação da tabela, essa restrição pode ser definida da seguinte forma (quando a chave primária é composta de uma só coluna):

create table Fornecedor (

CodFornecedor int not null primary key,

Nome varchar(50) null,

Endereco varchar(50) null,

Telefone varchar(20) null

)

Note que 'CodFornecedor' deve ter a opção NOT NULL. Não é possível criar uma chave primária com colunas que podem ser NULL. Opcionalmente, poderia ser informado um nome para a restrição, por exemplo 'ChaveFornecedor'. Nesse caso, a

segunda linha acima seria:

CodFornecedor int not null constraint ChaveFornecedor primary key,

Agora, na tabela Fornecedor, não pode haver duas linhas com o mesmo valor de 'CodFornecedor'. Quando a chave é composta de duas ou mais colunas, nesse caso ela tem que ser especificada com a lista de colunas entre parênteses, por exemplo:

create table ProdutoFornecedor

(CodProduto int, CodFornecedor int,

primary key (CodProduto, CodFornecedor))

Uma chave primária pode ser acrescentada à tabela depois que ela já foi criada, com o comando ALTER TABLE. Por exemplo, vamos acrescentar chaves primárias às tabelas Cliente e Produto:

alter table Cliente

add primary key nonclustered (CodCliente)

alter table Produto

add primary key clustered (CodProduto)

A opção NONCLUSTERED diz respeito ao tipo de índice que será criado para a chave primária. Se não especificada, o índice será CLUSTERED (v. capítulo anterior). Esse índice é criado ou excluído automaticamente, junto com a restrição. Em qualquer um dos casos pode-se especificar ou não o nome da restrição, na forma CONSTRAINT nome logo antes das palavras "PRIMARY KEY".

 

PARENT KEY

É uma PRIMARY KEY ou UNIQUE KEY de uma TABELA MESTRE (tabela mestre é a tabela da posição (1) da relação 1:N do MER). O valor da PARENT KEY será replicado nas FOREIGN KEY(chave estrangeira) das tabelas relacionadas (lado (N) da relação 1:N)

 

FOREIGN KEY (Chave estrangeira)

É uma KEY em uma TABELA RELACIONADA (lado N na relação 1:N) que identifica uma linha da TABELA MESTRE. As propriedades da FOREIGN KEY são:

  • Uma tabela pode ter zero, uma ou varias FOREIGN KEY.
  • Dependendo das regras de INTEGRIDADE REFERENCIAL (SET  NULL), o valor da FOREIGN KEY pode ser NULL.

Uma forma importante de integridade no banco de dados é a integridade referencial, que é a verificação de integridade feita entre duas tabelas. Por exemplo, a tabela 'ProdutoFornecedor' será usada para relacionar dados de produtos e fornecedores. Ela contém as colunas CodProduto e CodFornecedor. A primeira deve conter um código válido que exista na tabela 'Produto'. A outra deve ter um código válido existente na tabela 'Fornecedor'. Como validar essa verificação? Uma chave estrangeira [foreign key] é uma restrição de integridade referencial. Ela consiste de uma coluna ou grupo de colunas cujo valor deve coincidir com valores de outra tabela. No nosso caso, vamos adicionar duas chaves estrangeiras na tabela 'ProdutoFornecedor': CodProduto faz referência a Produto.CodProduto e CodFornecedor faz referência a Fornecedor.CodFornecedor:

alter table ProdutoFornecedor

  add foreign key (CodProduto) references Produto(CodProduto),

    foreign key (CodFornecedor) references Fornecedor(CodFornecedor)

Note que a chave primária de Produto é (CodProduto) e de Fornecedor é (CodFornecedor), como foi definido antes. Se fossem especificados apenas os nomes das tabelas, sem indicar entre parênteses as colunas, também funcionaria:

alter table ProdutoFornecedor

  add foreign key (CodProduto) references Produto,

    foreign key (CodFornecedor) references Fornecedor

Porque nesse caso é assumida a chave primária. Mas uma chave estrangeira pode fazer referência a colunas que não a chave primária, desde que possuam uma restrição UNIQUE definida. Outra forma de criar essas restrições é em conjunto com a tabela, da forma:

create table ProdutoFornecedor

  (CodProduto int foreign key references Produto,

    CodFornecedor int foreign key references Fornecedor, primary key (CodProduto, CodFornecedor))

Esse tipo de restrição não cria um índice automaticamente, embora muitas vezes seja recomendável criar para maior desempenho (geralmente não-clustered). Pode-se especificar o nome da restrição opcionalmente, na forma CONSTRAINT nome, logo antes das palavras "FOREIGN KEY".

 

REGRAS DE INTEGRIDADE

O DB2 possui algumas regras de validação de seus dados que são definidos no momento da definição de suas tabelas. Estas validações independem dos programas que atualizam o banco de dados, e são executadas automaticamente quando se incluem alteram ou excluem dados das tabelas. As regras de integridade são:

UNICIDADE.

Esta regra define que uma ou varias colunas (KEYS), da tabela não podem repetir valores. É a regra usada para definir UNIQUE KEYS.

INTEGRIDADE DE VALORES (CHECK CONSTRAINTS)

Esta regra define valores permitidos para colunas de uma tabela.

INTEGRIDADE REFERENCIAL

A INTEGRIDADE REFERENCIAL define a validade de uma FOREIGN KEY:

  • Se uma FOREIGN KEY não contem NULL, seu valor deve ser o da PARENT KEY da TABELA MESTRE.
  • A INTEGRIDADE REFERENCIAL deve ser definida na criação da tabela.
  • O DB2 testa a INTEGRIDADE REFERENCIAL nos comandos de inclusão, alteração e exclusão dos programas conforme abaixo:

INTEGRIDADE NA INCLUSÃO.

Se uma linha tiver uma coluna FOREIGN KEY com valor NOT NULL, deve haver uma linha na PARENT TABLE com este valor na PARENT KEY.

INTEGRIDADE NA ALTERAÇÃO.

Se houver alteração em uma FOREIGN KEY, deve haver na PARENT TABLE uma PARENT KEY com o novo valor da FOREIGN KEY.

INTEGRIDADE NA EXCLUSÃO.

A exclusão de linhas com FOREIGN KEY não tem restrição. Se uma linha tiver uma coluna com PARENT KEY, uma das 3 regras de exclusão abaixo deve ser definida na criação da tabela:

  • RESTRICT – A exclusão não será efetuada se houver uma TABELA DEPENDENTE com uma FOREIGN KEY com este valor.
  • CASCADE – O DB2 fará a exclusão automática de todas as linhas das TABELAS DEPENDENTES com este valor na FOREIGN KEY. Se estas exclusões tiverem sucesso, a linha da PARENT TABLE será excluída.
  • SET NULL – As FOREIGN KEY nas TABELAS DEPENDENTES serão alteradas para NULL.