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.
Respuestas:
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.
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:
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.
fuente
La documentación que ya has leído lo dice bastante bien. Para explicar más a fondo:
Normalmente un
update
acto en una sola mesa. Para evitar subconsultas tortuosas en el filtro, Oracle le permiteupdate
una 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 laset
cláusula solo modifica columnas en una tabla 'clave preservada':Por ejemplo:
la primera actualización falla porque Oracle no tiene manera de 1: 1 de mapeo
foo_val
en la consulta parafoo_val
enfoo
- por el contrario la segunda actualización tiene éxito porque Oracle puede 1: 1 mapear cadabar_val
abar_val
enbar
. Lo importante es quefoo_id
es único enfoo
, por lo que para cada fila enbar
, solo puede haber como máximo una fila correspondiente enfoo
( 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)fuente
Permítanme dar un ejemplo primero y explicarlo más tarde. Considere 2 tablas Estudiantes (t_estudiantes) y Curso (t_curso).
Cuando estas dos tablas se unen ->
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:
Este es el concepto de tablas conservadas clave.
Para saber si las columnas de vista son actualizables,
PD: proporcione el nombre de la tabla / vista en letras MAYÚSCULAS.
fuente