4.2. Herencia

PostgreSQL ofrece como característica particular la herencia entre tablas, que permite definir una tabla que herede de otra previamente definida, según la definición de herencia que hemos visto en capítulos anteriores.

Retomemos la tabla persona definida como sigue:

create table persona (
nombre varchar (30),
direccion varchar (30)
);

A partir de  esta  definición, creamos la tabla estudiante  como derivada de persona:

create table estudiante (
demo(# carrera varchar(50),
demo(# grupo char,
demo(# grado int
demo(# ) inherits ( persona );
CREATE

 

En la tabla estudiante se definen las columnas carrera, grupo y grado, pero al so- licitar información de la estructura de la tabla observamos que también inclu- ye las columnas definidas en persona:

demo=# \d estudiante
Table "estudiante"
Column     |Type                   | Modifiers
-----------+-----------------------+-----------
    nombre | character varying(30) |
direccion | character varying(30) |
   carrera | character varying(50) |
     grupo |          character(1) |
     grado |               integer |

En este caso, a la tabla persona la llamamos padre y a la tabla estudiante, hija.

Cada registro de la tabla estudiante contiene 5 valores porque tiene 5 columnas:

demo=# insert into estudiante values (
demo(# `Juan´ ,
demo(# `Treboles 21´,
demo(# `Ingenieria en Computacion´,
demo(# `A´,
demo(# 3
demo(# );
INSERT 24781 1
La herencia no sólo permite que la tabla hija contenga las columnas de la tabla padre, sino que establece una relación conceptual es-un.

La consulta del contenido de la tabla estudiante mostrará, por supuesto, un solo registro. Es decir, no se heredan los datos, únicamente los campos (atributos) del objeto:

demo=# select * from estudiante;
nombre  |direccion    |carrera                    |grupo  | grado
--------+-------------+---------------------------+-------+-------
   Juan | Treboles 21 | Ingenieria en Computacion |     A | 3
(1 row)

Además, la consulta de la tabla persona mostrará un nuevo registro:

 

demo=# select * from persona;
nombre                 | direccion
-----------------------+-------------
  Federico Garca Lorca | Granada 65
       Alejandro Magno | Babilonia
                  Juan | Treboles 21
(3 rows)

El último registro mostrado es el que fue insertado en tabla estudiante, sin embargo la herencia define una relación conceptual en la que un estudiante es-una persona. Por lo tanto, al consultar cuántas personas están registradas en la base de datos, se incluye en el resultado a todos los estudiantes. Para consultar sólo a las personas que no son estudiantes, podemos utilizar el modificador ONLY:

demo=# select * from only persona;
nombre                 | direccion
-----------------------+------------
       Alejandro Magno | Babilonia
Federico García Lorca | Granada 65
(2 rows)
demo=#
No es posible borrar una tabla padre si no se borran primero las tablas hijo.
demo=# drop table persona;
NOTICE: table estudiante depende de table persona
ERROR: no se puede eliminar table persona porque otros objetos dependen de él
HINT: Use DROP ... CASCADE para eliminar además los objetos dependientes.

Como es lógico, al borrar la fila del nuevo estudiante que hemos insertado, se borra de las dos tablas. Tanto si lo borramos desde la tabla persona, como si lo borramos desde la tabla estudiante.