O que é o conceito de tabela preservada chave?


12

Li na documentação da Oracle sobre tabela preservada por chave na seção Atualizando visualizações de junção.

No entanto, não achei nada simples de entender.

Espero receber alguns detalhes conceituais simples, além da documentação oficial da Oracle.


1
Você já viu isso no AskTom?
Jack diz que tente topanswers.xyz 5/11/11

Aqui está outra explicação que me fez compreender este conceito complicado: dba.stackexchange.com/questions/38728/...
Vadzim

Respostas:


7

Chave preservada significa que 1 valor da chave vai para 1 tabela. Dar exemplos de contadores pode ajudá-lo a entender melhor esse conceito.

Exemplo 1:

Sua visão contém agregação. Suponha que você tenha a seguinte estrutura de exibição.

GroupID, AverageSalary
1 , 10000
2, 12000
3, 14000

Neste exemplo: seus valores vêm de mais de uma linha. Se você tentar atualizar o AverageSalary nessa exibição, o banco de dados não poderá encontrar WHICH linhas a serem atualizadas.

Exemplo2: Sua visualização mostra valores de mais de uma tabela. Sua visualização mostra valores da tabela PERSON e PERSON_CONTACT_DETAILS (ID, PersonID, ContactType, ContactValue).

Linhas de exemplo:

 1,1,email,ddd@example.com
 1,1,phone,898-98-99

Você se junta a esta tabela 2 e mostra mais informações favoráveis ​​aos negócios.

PersonId, Nome, Sobrenome, Telefone1, Email1

Aqui você deseja atualizar o Phone1 e o Email1. Mas o seu personID mapeia para duas linhas diferentes, pode haver mais linhas, neste exemplo. Nesta visão, novamente, o banco de dados não tem como encontrar as linhas que atualizar.

Nota: Se você restringir o modo de exibição sql e deixar claro a localização de quais linhas atualizar, isso pode funcionar.

Este dois exemplos são os primeiros exemplos que me vêm à mente. Eles podem ser aumentados. Mas o conceito é claro. O banco de dados precisa mapear 1 valor-chave para 1 tabela. Por exemplo, você possui as tabelas PERSON, PERSON_DETAILS. Aqui, a visualização e atualização funcionará, pois é um para um.


e se a tabela que você deseja atualizar contiver uma chave primária composta?
johny why

7

A documentação que você já leu diz muito bem. Para explicar mais:

O conceito de uma tabela preservada por chave é fundamental para entender as restrições na modificação de visualizações de junção.

Normalmente, updateatua em uma única tabela. Para evitar subconsultas tortuosas no filtro, o Oracle permite updateuma visualização (ou subconsulta) desde que ainda seja possível mapear facilmente as alterações que você está fazendo nas linhas subjacentes reais de uma tabela. Isso é possível se a setcláusula modificar apenas as colunas em uma tabela 'chave preservada':

Uma tabela é preservada por chave se todas as chaves da tabela também puderem ser a chave do resultado da associação. Portanto, uma tabela preservada por chave tem suas chaves preservadas por meio de uma junção.

Por exemplo:

create table foo( foo_id integer primary key, foo_val integer not null );
create table bar( bar_id integer primary key, bar_val integer not null, 
                  foo_id integer not null references foo );

update (select * from foo join bar using(foo_id)) set foo_val=1;
ORA-01779: cannot modify a column which maps to a non key-preserved table

update (select * from foo join bar using(foo_id)) set bar_val=1;
0 rows updated.

a primeira atualização falha porque a Oracle não tem como mapeamento 1: 1 foo_valna consulta para foo_valem foo- inversamente a segunda atualização sucede porque a Oracle pode 1: 1 mapear cada bar_valpara bar_valno bar. O importante é que foo_idseja único foo- portanto, para cada linha inserida bar, só pode haver no máximo uma linha correspondente foo( na verdade, exatamente 1 neste exemplo, mas o mesmo se aplica a uma chave estrangeira anulável - o ponto é que nunca há mais de uma linha).


3

Deixe-me dar um exemplo primeiro e explicar depois. Considere 2 tabelas Estudantes (t_students) e Curso (t_course).

  • A tabela de alunos (stundentid, nome, courseid) possui uma chave primária na identificação do aluno.
  • A tabela do curso (courseid, coursename) possui uma chave primária na identificação do curso.

Quando essas duas tabelas são unidas ->

select * from t_students S, t_course C where S.courseid=C.courseid; 

Os dados resultantes terão exatamente o mesmo número de linhas da tabela Alunos. Não haverá valores duplicados de studentid no conjunto de resultados (studentid é preservado). No entanto, embora o material didático seja único na tabela de cursos, ele será repetido várias vezes no conjunto de resultados, pois muitos alunos podem ter optado pelo mesmo curso (em outras palavras, o material didático não é preservado).

Com este exemplo, você pode concluir que:

  • Cada chave na tabela base atua como a chave para os dados resultantes após a associação (studentid)
  • As linhas da linha de base aparecem nos dados resultantes no máximo apenas uma vez (sem linhas duplicadas)

Este é o conceito de tabelas preservadas principais.

Para saber se as colunas da exibição são atualizáveis,

select * from all_updatable_columns where table_name='V_VIEW_NAME';

PS: forneça o nome da tabela / exibição em letras maiúsculas.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.