martes, 30 de octubre de 2018

Relaciones entre tablas

Buenas noches queridos lectores, en esta ocasión continuando con el tema de las tablas, hablaremos de las relaciones, ¿como es que las tablas de base de datos se relacionan?. Pues para eso existen las llaves primarias (PRIMARY KEY) y las llaves foráneas (FOREIGN KEY). En uno de los post pasado, habíamos creado la siguiente tabla:


CREATE TABLE PAISES
(
       ID INT PRIMARY KEY,
       CODIGOPAIS VARCHAR(4),
       NOMBRE VARCHAR(100),
       COMENTARIOS VARCHAR(MAX),
       CREADO DATE,
       MODIFICADO DATE
)
ON CATALOGOS


Llave primaria


Detengámonos un momento en la línea , justo donde dice PRIMARY KEY, esa propiedad en el campo ID, nos indica que ese campo es la llave primaria, es decir el campo principal, con el cual podremos unir con otra tabla. Es ampliamente recomendable que todas las tablas tengan una llave primaria, se podía incluso crear una llave primaria mediante campos compuestos.

Con la llave primaria podremos unir o relacionar las tablas, una llave primaria puede ser en otra tabla una llave foránea.

Pero entonces ¿Que es una llave foránea?

Llave foránea

Una clave foránea es una columna o grupo de columnas de una tabla que contiene valores que coinciden con la clave primaria de otra tabla. Las claves foráneas se utilizan para unir tablas.

Es fácil detectar una relación entre tablas, pues los campos de una llave primaria de una tabla están presentes en otra tabla, a dichos campos se les conoce como campos de coincidencia. La tabla donde los campos de coincidencia son la llave primaria se conoce con el nombre de tabla fuerte, y la otra donde los campos de coincidencia no son la llave primaria, se le llama tabla débil.

Se tienen los siguientes tipos de relaciones:

  • Relación no exigida. Vínculo entre las tablas en el que la llave primaria de una tabla hace referencia a una llave foránea de otra tabla y que no comprueba la integridad referencial durante las transacciones de actualización o de inserción.
  • Relación reflexiva: Relación de una o varias columnas de una tabla con otras columnas de la misma tabla
  • Relación uno a uno: En base de datos relacionales, es la relación entre dos tablas en el que una fila de la primera tabla solo se puede relacionar con una fila de la segunda tabla y la fila de la segunda tabla, solo se puede relacionar con la fila de la primera tabla.
  • Relación uno a muchos: Relación entre dos tablas que se pueden relacionar una única fila de la primera tabla con una o mas filas de la segunda tabla, pero una fila de la segunda tabla solo puede estar relacionada con una fila de la primera tabla.
  • Relación muchos a muchos: Relación entre dos tablas en las que las filas de cada tabla tienen varias filas coincidentes en la tabla relacionada. Las relaciones muchos a muchos se mantienen mediante la utilización de una tercera tabla, denominada Tabla de unión o Tabla pivote, y la adición a esta tabla de columnas de clave primaria procedentes de cada una de las dos tablas.

En el caso de SQL SERVER, la mayoría de las relaciones son de uno a muchos. Para definirlas basta con agregar la restricción FOREIGN KEY al momento de crear la tabla. Es muy importante tomar en cuenta que para poder establecer una relación entre tablas, la tabla fuerte debe tener su llave primaria con una restricción del tipo PRIMARY KEY o UNIQUE.

Pero seguramente ya los aburrí con tanta teoría, mejor pasemos a lo que nos gusta y como se aprende que es hacer.

¿Como crear llaves foráneas?

Veamos el siguiente script para la creación de una tabla:

CREATE TABLE estadios (
  id int NOT NULL,
  nombre varchar(100) NOT NULL,
  imagen varchar(100) NOT NULL,
  capacidad bigint NOT NULL,
  ciudad varchar(100) NULL,
  direccion text,
  inaugurado date DEFAULT NULL,
  comentarios text,
  creado DATETIME NOT NULL,
  modificado DATETIME NOT NULL,
  pais_id int NOT NULL,
  estatus bit DEFAULT NULL,
  PRIMARY KEY (id),
  CONSTRAINT estadios_fk_estadios_pais_id FOREIGN KEY (pais_id) REFERENCES paises (id)
)
ON CATALOGOS

Mediante la restricción CONSTRAINT podemos agregar las llaver foráneas, en este caso tenemos dos tablas, una llamada PAISES y la otra llamada ESTADIOS, el estadio pertenece a un país, es por eso que en la tabla estadios tenemos un campo pais_id, y el contraint al cual le pusimos de nombre estadios_fk_estadios_pais_id, es la llave foránea a la que, en el campo pais_id hace referencia a la tabla PAISES, en el campo id.
De esta manera, si queremos agregar un estadio nuevo, forzozamente tendremos que tener creado el país, vamos a hacer el ejemplo de INSERT, aunque en post posteriores lo veremos con mas detalle.


INSERT INTO estadios
(id,nombre,imagen,capacidad,ciudad,direccion,inaugurado,comentarios,creado,modificado,pais_id,estatus)
VALUES
(1,'Azteca','azteca.jpg',110000,'Ciudad de México','Calzada de Tlalpan 3465','1966-05-29','Comentarios',CURRENT_TIMESTAMP,
CURRENT_TIMESTAMP,1,1);

En la consulta anterior estamos intentando dar de alta un estadio (El estadio Azteca), pero como comentábamos existe un campo ligado a la tabla de paises el campo pais_id, por lo cual esto nos obliga a que, cuando no exista dicho país, no se pueda crear el registro correspondiente y de esta manera mantiene la integridad de los datos.


El error que muestra es el siguiente:


Msg 547, Level 16, State 0, Line 31
The INSERT statement conflicted with the FOREIGN KEY constraint "estadios_fk_estadios_pais_id". The conflict occurred in database "ESTADISTICAS", table "dbo.PAISES", column 'ID'.
The statement has been terminated.

Como pueden ver, el mensaje esta muy claro, existe un conflicto con la llave foránea porque el país que contiene el código 1 no existe. Ahora vamos a ingresar el país México


INSERT INTO PAISES (ID, CODIGOPAIS, NOMBRE, COMENTARIOS, CREADO, MODIFICADO) VALUES
(1, 'MEX', 'MEXICO', 'COMENTARIO', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
 



Ahora si, ya podremos ejecutar el primer script que ingresaba el estadio. Lo ejecutamos y corroboramos que los datos fueron ingresados correctamente




Como podemos observar, en el campo pais_id de la tabla estadio contiene el valor 1, mismo valor que la tabla paises en el campo id, de esta manera podremos relacionar la tabla, y sabremos que el estadio Azteca, está en México.


Hasta aquí el post, en las próximas publicaciones continuaremos aprendiendo más sobre la lógica y las instrucciones en SQL SERVER.


Cualquier duda, no vacilen en preguntar, los ayudaré en la medida de lo posible, espero pregunten, comenten, den +1 o clic en algún anuncio para ayudar a los gastos del dominio. Muchas gracias

Banderas de Visitantes

Flag Counter