Como manter a integridade referencial em um banco de dados sql multitable

Video: Aula 02 Banco de Dados - Integridade Referencial

Mesmo que cada mesa em seu sistema SQL tem a integridade da entidade e integridade de domínio, você ainda pode ter um problema por causa de inconsistências na forma como uma tabela relaciona-se com outro. Em bases de dados várias tabelas mais bem concebido, cada quadro contém, pelo menos, uma coluna que se refere a uma coluna na outra tabela na base de dados.

Essas referências são importantes para manter a integridade global do banco de dados. As mesmas referências, no entanto, fazer atualização anomalias possível. anomalias de atualização são problemas que podem ocorrer depois que você atualizar os dados em uma linha de uma tabela de banco de dados.

Problemas entre tabelas pai e filho

As relações entre tabelas geralmente não são bidirecionais. Uma mesa é normalmente dependente do outro. Diga que você tem um banco de dados com uma tabela CLIENTE e uma tabela Pedidos. Você pode entrar um cliente na tabela de cliente antes que ela faz ordens. Você não pode, no entanto, introduzir uma ordem na tabela ORDENS a menos que você já tenha uma entrada na tabela de cliente para o cliente que está fazendo nessa ordem.

A tabela ORDENS é dependente da tabela do CLIENTE. Este tipo de arranjo é frequentemente chamado de relação entre pais e filhos, onde cliente é a tabela pai e ordens é a tabela filho. A criança é dependente do pai.

Geralmente, a chave principal da tabela pai é uma coluna (ou grupo de colunas) que aparece na tabela a criança. Dentro da tabela de criança, que mesmo em coluna (ou grupo) é uma chave estrangeira. Tenha em mente, no entanto, que uma chave estrangeira não precisa ser exclusivo.

Video: Integridade referencial no MySQL

anomalias de atualização surgem de várias maneiras entre tabelas pai e filho. Um cliente se afasta, por exemplo, e que deseja excluir seu informações do seu banco de dados. Se ela já fez algumas ordens (que você gravou na tabela de pedidos), apagando-a tabela de cliente poderia apresentar um problema.

Você teria registros na tabela Pedidos (filho) para o qual você não tem registros correspondentes na tabela CLIENTE (pai). Problemas semelhantes podem surgir se você adicionar um registro a uma tabela criança sem fazer uma adição correspondente para a tabela pai.

As chaves estrangeiras correspondentes em todas as tabelas filho deve refletir quaisquer alterações à chave primária de uma linha em uma mesa- pai de outra forma o resultado é uma atualização anomalia.

Use cascata eliminações com cuidado

Você pode eliminar a maioria dos problemas de integridade referencial, controlando cuidadosamente o processo de atualização. Em alguns casos, você tem que cascata exclusões de uma tabela pai para seus filhos. Em cascata uma exclusão quando você exclui uma linha de uma tabela pai, você também exclui todas as linhas de suas tabelas filho cujas chaves estrangeiras coincidir com a chave primária da linha excluída na tabela pai.



Dê uma olhada no seguinte exemplo:

CRIAR CLIENTE TABELA (ClientName CHAR (30) CHAVE PRIMÁRIA, Endereço1 CHAR (30), Endereço2 CHAR (30), CityCHAR (25) não nulo, StateCHAR (2), CódigoPostal CHAR (10), PhoneCHAR (13), fax CHAR ( 13), Contactperson CHAR (30)) TESTES DE MESA --Cria (TestName CHAR (30) PRIMÁRIA CHAVE, StandardCharge CHAR (30)) --Cria TABELA funcionário (EmployeeName CHAR (30) CHAVE PRIMÁRIA, ADDRESS1 CHAR (30), Endereço2 CHAR ( 30), CityCHAR (25), StateCHAR (2), CódigoPostal CHAR (10), HomePhone CHAR (13), OfficeExtension CHAR (4), DataDeContratação DATA, JobClassification CHAR (10), HourSalComm CHAR (1)) ORDENS DE MESA --Cria (OrderNumber INTEGER PRIMARY CHAVE, ClientName CHAR (30), TestOrdered CHAR (30), Vendedor CHAR (30), DataDaEncomenda DATA, RESTRIÇÃO NameFK FOREIGN KEY (ClientName) Referências CLIENTE (ClientName) EM CASCATA DELETE RESTRIÇÃO TestFK EXTERNA CHAVE (TestOrdered) Referências testes (TestName) ON DELETE CASCADE, CONSTRAINT SalesFK FOREIGN KEY (vendedor) REFERÊNCIAS DOS TRABALHADORES (EmployeeName) ON DELETE CASCADE) -

a restrição NameFK nomes Nome do cliente como uma chave estrangeira que referencia a Nome do cliente coluna na tabela CLIENTE. Se você excluir uma linha na tabela de cliente, você também excluir automaticamente todas as linhas na tabela Pedidos que têm o mesmo valor no Nome do cliente coluna como aqueles na Nome do cliente coluna da tabela de CLIENTE.

A deleção em cascata para baixo da tabela CLIENT a tabela Pedidos. O mesmo é válido para as chaves estrangeiras na tabela Pedidos que se referem às chaves primárias dos testes e tabelas EMPREGADOS.

formas alternativas para controlar anomalias de atualização

Você não pode querer cascata uma deleção. Em vez disso, você pode querer mudar a chave estrangeira da tabela filho para um NULO valor. Considere o seguinte variante:

Video: Restaurar Banco de Dados

Criar pedidos de mesa (OrderNumber INTEIRO Chave Primária, ClientName CHAR (30), TestOrdered CHAR (30), SalesPerson CHAR (30), DataDaEncomenda DATA, RESTRIÇÃO NameFK FOREIGN KEY (ClientName) Referências CLIENTE (ClientName), RESTRIÇÃO TestFK EXTERNA CHAVE (TestOrdered) Referências testes (TestName), CONSTRAINT SalesFK FOREIGN KEY (vendedor) REFERÊNCIAS DOS TRABALHADORES (EmployeeName) ON DELETE SET NULL) -

a restrição SalesFK nomes do vendedor coluna como uma chave estrangeira que referencia a Nome do empregado coluna da tabela EMPLOYEE. Se um vendedor deixa a empresa, você excluir sua linha na tabela EMPREGADOS. Novos vendedores são eventualmente atribuídos a suas contas, mas por agora, a exclusão de seu nome da tabela EMPREGADOS faz com que todos os seus pedidos na tabela de forma a receber um valor nulo na vendedor coluna.

Você também pode manter dados inconsistentes fora de um banco de dados usando um dos seguintes métodos:

  • Recusar-se a permitir que uma adição a uma tabela criança até que existe uma fila correspondente na sua tabela pai. Se você se recusa a permitir linhas em uma tabela filho sem uma linha correspondente em uma tabela pai, você prevenir a ocorrência de linhas “órfãos” na tabela filho. Esta recusa ajuda a manter a consistência entre tabelas.

  • Recuse-se a permitir alterações em chave primária de uma tabela. Se você se recusa a permitir alterações em chave primária de uma tabela, você não precisa se preocupar em atualizar as chaves estrangeiras em outras tabelas que dependem desse chave primária.

    Video: 声明关系


Publicações relacionadas