¿Qué es el concepto de tabla conservada clave?

12

Leí en la Documentación de Oracle sobre la tabla con clave preservada en la sección Actualización de vistas de unión.

Sin embargo, no encontré ninguna manera fácil de entenderlo.

Espero recibir algunos detalles conceptuales simples que no sean la documentación oficial de Oracle.

parmanand
fuente
1
¿Has visto esto en AskTom?
Jack dice que intente topanswers.xyz
Aquí hay otra explicación que me hizo comprender este concepto complicado: dba.stackexchange.com/questions/38728/…
Vadzim

Respuestas:

7

Clave preservada significa que 1 valor clave va a 1 tabla. Dar ejemplos contrarios puede ayudarlo a comprender mejor este concepto.

Ejemplo 1:

Su vista contiene agregación. Suponga que tiene la siguiente estructura de vista.

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

En este ejemplo: sus valores provienen de más de una fila. Si intenta actualizar AverageSalary en esta vista, la base de datos no tiene forma de encontrar CUÁLES filas para actualizar.

Ejemplo2: su vista muestra valores de más de una tabla. Su vista muestra valores de la tabla PERSON y PERSON_CONTACT_DETAILS (ID, PersonID, ContactType, ContactValue).

Filas de ejemplo:

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

Usted se une a esta tabla 2 y muestra más información amigable para los negocios a la vista.

PersonId, Nombre, Apellido, Teléfono1, Correo electrónico1

Aquí desea actualizar Phone1 y Email1. Pero su personID se asigna a dos filas diferentes, en este ejemplo puede haber más filas. En esta vista, una vez más, la base de datos no tiene forma de encontrar CUÁLES filas para actualizar.

Nota: Si restringe su vista sql y deja en claro qué filas actualizar, puede funcionar.

Estos dos ejemplos son los primeros ejemplos que me vienen a la mente. Se pueden aumentar. Pero el concepto es claro. La base de datos necesita asignar 1 valor clave a 1 tabla. Por ejemplo, tiene tablas PERSON, PERSON_DETAILS de uno a uno. Aquí ver y actualizar funcionará ya que es uno a uno.

Atilla Ozgur
fuente
¿Qué sucede si la tabla que desea actualizar contiene una clave primaria compuesta?
johny por qué
7

La documentación que ya has leído lo dice bastante bien. Para explicar más a fondo:

El concepto de una tabla con clave preservada es fundamental para comprender las restricciones sobre la modificación de vistas de unión.

Normalmente un updateacto en una sola mesa. Para evitar subconsultas tortuosas en el filtro, Oracle le permite updateuna vista (o subconsulta) siempre y cuando todavía pueda asignar fácilmente los cambios que está realizando en filas subyacentes reales en una tabla. Esto es posible si la setcláusula solo modifica columnas en una tabla 'clave preservada':

Una tabla se conserva con clave si cada clave de la tabla también puede ser una clave del resultado de la unión. Por lo tanto, una tabla con clave preservada tiene sus claves preservadas a través de una unión.

Por ejemplo:

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.

la primera actualización falla porque Oracle no tiene manera de 1: 1 de mapeo foo_valen la consulta para foo_valen foo- por el contrario la segunda actualización tiene éxito porque Oracle puede 1: 1 mapear cada bar_vala bar_valen bar. Lo importante es que foo_ides único en foo, por lo que para cada fila en bar, solo puede haber como máximo una fila correspondiente en foo( en realidad exactamente 1 en este ejemplo, pero lo mismo se aplica para una clave foránea anulable), el punto es que nunca hay más de una fila)

Jack dice que intente topanswers.xyz
fuente
3

Permítanme dar un ejemplo primero y explicarlo más tarde. Considere 2 tablas Estudiantes (t_estudiantes) y Curso (t_curso).

  • La tabla de estudiantes (stundentid, name, courseid) tiene una clave principal en la identificación del estudiante.
  • La tabla del curso (courseid, coursename) tiene una clave principal en la ID del curso.

Cuando estas dos tablas se unen ->

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

Los datos resultantes tendrán exactamente el mismo número de filas que la tabla Estudiantes. No habrá valores duplicados de studentid en el conjunto de resultados (se conserva studentid). Sin embargo, aunque el Courseid es único en la tabla del curso, se repetirá varias veces en el conjunto de resultados, ya que muchos estudiantes pueden haber optado por el mismo curso (en otras palabras, Courseid no se conserva).

Con este ejemplo, puede llegar a la conclusión de que:

  • Cada clave en la tabla base actúa como la clave de los datos resultantes después de unirse (studentid)
  • Las filas de la fila base aparecen en los datos resultantes casi una sola vez (sin filas duplicadas)

Este es el concepto de tablas conservadas clave.

Para saber si las columnas de vista son actualizables,

select * from all_updatable_columns where table_name='V_VIEW_NAME';

PD: proporcione el nombre de la tabla / vista en letras MAYÚSCULAS.

Elegante
fuente