Relaciones entre tablas



Relaciones entre tablas

Los datos que se metan en las tablas deben ser lógicos y capaces de someterse a revisiones de integridad, por lo que una base de datos como Sql Server es capaz de proveernos de muchas cosas para garantizar que los datos que se alojen en las tablas sean coherentes y no se meta allí cualquier cosa que se nos ocurra, una de las cosas mas importantes que hay que tener en cuenta es la relación de las tablas.


Imagine el siguiente ejemplo:




Supongamos que hago una consulta a estas dos tablas de la siguiente manera:

En nuestro management studio presionamos el botón Nueva consulta (New query), escribimos el código siguiente y presionamos el botón ejecutar (execute).


--1) Insertamos registros en las tablas Factura y RenglonFactura

insert into factura(Id,Cliente_Id,Observación,Fecha,SubTotal,iva,Total)
values (1,'001','',cast('20190101' as datetime),100,12,112)

insert into RenglonFactura(Factura_Id,Renglon_id,Cod_producto,SubTotal,Iva,ToatlRenglon)
values(2,1,'001',100,12,112)

--2) Consultamos las dos tablas para revisar lo que insertamos

select * from Factura

select * from RenglonFactura


Este código lo interpretamos de la siguiente manera, en la parte 1 insertamos registros tanto en la tabla factura como en la que corresponde a sus renglones, en la parte 2 vemos lo que insertamos, y esto nos da como resultado lo siguiente:




El resultado de la consulta nos muestra que se insertaron datos de forma correcta, sin embargo existe un error y es que la tabla RenglonFactura no debería permitir que se inserte un número diferente a 1 (Que es el único que existe en la tabla Factura), esto da paso a cualquier posibilidad de error en los datos.


Como se corrige esto?

Para corregir esto y que Sql impida que se registre en RenglonFactura algo que no exista en Factura se usan las nombradas relaciones lo cual se puede implementar de diferentes formas. Aquí hablaremos de un método sencillo para establecer esta relación y en otro capitulo intermedio mostraré los tipos de relaciones que existen y profundizaremos en cada una de ellas.

Para hacer una relación por el diagrama de BD es muy sencillo, primero debemos borrar los registros que incluimos (mas abajo muestro como lo hacemos), luego solo hacemos click  en el campo clave de la tabla Factura (Id) y lo arrastramos hasta la tabla de RenglonFactura (Campo Factura_Id), con esto se establece la relación.

--Código para borrar los registros

delete from RenglonFactura
delete from Factura


Así debe quedar:


Para crear esta misma relación por transact se hace de la siguiente manera:

ALTER TABLE RenglonFactura
ADD CONSTRAINT FK_Factura
FOREIGN KEY (Factura_Id) REFERENCES Factura(Id);

Ahora si intentáramos insertar los registros con el código anterior, veremos que nos da un error:

insert into factura(Id,Cliente_Id,Observación,Fecha,SubTotal,iva,Total)
values (1,'001','',cast('20190101' as datetime),100,12,112)

insert into RenglonFactura(Factura_Id,Renglon_id,Cod_producto,SubTotal,Iva,ToatlRenglon)
values(2,1,'001',100,12,112)


--Resultado que se genera: (1 row affected)
Msg 547, Level 16, State 0, Line 11
The INSERT statement conflicted with the FOREIGN KEY constraint "FK_RenglonFactura_Factura". The conflict occurred in database "MiBd", table "dbo.Factura", column 'Id'.

The statement has been terminated.


Este error es por que estamos intentando meter en los reglones de la factura un registro que no existe en la tabla Factura, para poder hacerlo de forma correcta deberemos volver a borrar los registros y hacerlo de la siguiente manera:

delete from Factura --Para borrar el registro que se insertó


insert into factura(Id,Cliente_Id,Observación,Fecha,SubTotal,iva,Total)
values (1,'001','',cast('20190101' as datetime),100,12,112)

insert into RenglonFactura(Factura_Id,Renglon_id,Cod_producto,SubTotal,Iva,ToatlRenglon)
values(1,1,'001',100,12,112) --Con el valor de 1 en el campo relacionado con la tabla Factura


De esta forma ya podemos consultar nuevamente nuestros registros, teniendo la seguridad de que no se creará una inconsistencia que perjudique la información de nuestras tablas, conservando la calidad de los registros que almacenamos.




Si necesitas alguna información adicional o se generan dudas al respecto, deja un comentario y con gusto te responderé.

Comentarios

Entradas populares de este blog

Conocer la cantidad de un carácter específico en una cadena de texto

Consultas dinámicas

Funciones para análisis Lag y Lead