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.
Respostas:
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.
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:
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.
fonte
A documentação que você já leu diz muito bem. Para explicar mais:
Normalmente,
update
atua em uma única tabela. Para evitar subconsultas tortuosas no filtro, o Oracle permiteupdate
uma 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 aset
cláusula modificar apenas as colunas em uma tabela 'chave preservada':Por exemplo:
a primeira atualização falha porque a Oracle não tem como mapeamento 1: 1
foo_val
na consulta parafoo_val
emfoo
- inversamente a segunda atualização sucede porque a Oracle pode 1: 1 mapear cadabar_val
parabar_val
nobar
. O importante é quefoo_id
seja únicofoo
- portanto, para cada linha inseridabar
, só pode haver no máximo uma linha correspondentefoo
( 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).fonte
Deixe-me dar um exemplo primeiro e explicar depois. Considere 2 tabelas Estudantes (t_students) e Curso (t_course).
Quando essas duas tabelas são unidas ->
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:
Este é o conceito de tabelas preservadas principais.
Para saber se as colunas da exibição são atualizáveis,
PS: forneça o nome da tabela / exibição em letras maiúsculas.
fonte