martes, 5 de diciembre de 2017

Claves foráneas en Microsoft SQL Server

   



Uno de los conceptos más importantes en las bases de datos es crear relaciones entre las tablas de la base de datos. Estas relaciones proporcionan un mecanismo para vincular los datos almacenados en múltiples tablas y recuperarlo de manera eficiente. Para crear un enlace entre dos tablas, debe especificar una clave externa en una tabla que haga referencia a una columna en otra tabla.

TABLAS DE BASE DE DATOS Y RELACIONES

Es posible que ya sepa que las bases de datos son  simplemente una serie de tablas , similar a lo que se podría usar en un programa de hoja de cálculo , como Microsoft Excel.

De hecho, incluso puedes convertir una hoja de cálculo de Excel en una base de datos . Sin embargo, las bases de datos divergen de las hojas de cálculo cuando se trata de construir relaciones poderosas entre las tablas.

Considere, por ejemplo, una base de datos utilizada por una empresa para rastrear la información de recursos humanos. Esa base de datos puede tener una tabla llamada Empleados que contenga la siguiente información para cada miembro del personal de la compañía:

  • ID de empleado
  • Nombre
  • Apellido
  • Telefono de oficina
  • Teléfono de casa
  • ID puesto
En este ejemplo, el ID de empleado es un entero generado de manera exclusiva que se asigna a cada empleado cuando se agregan datos a la base de datos. El ID puesto es un código de trabajo utilizado para hacer referencia al puesto del empleado en la empresa. En este esquema, un empleado solo puede tener un puesto, pero múltiples (o no) empleados pueden ocupar cada puesto. Por ejemplo, puede tener cientos de empleados con un puesto de "Cajero".

La base de datos también puede contener una tabla llamada Puestos con la siguiente información adicional sobre cada posición:
  • ID puesto
  • Título
  • Nivel de trabajo
  • Categoría de habilidad
  • Ubicación
El campo ID puesto en esta tabla es similar al campo ID de empleado en la tabla Empleados; es un entero generado de forma exclusiva que se crea cuando se agrega un nuevo puesto a la base de datos.

Cuando vayamos a sacar una lista de empleados de la base de datos, sería natural solicitar el nombre de cada persona y su título.

Sin embargo, esta información se almacena en varias tablas de la bases de datos, por lo que solo se puede recuperar utilizando una consulta JOIN que requiere una relación existente entre las tablas.

Cuando mira la estructura de las tablas, el campo que define la relación es probablemente obvio:
El campo ID Puesto.Cada empleado puede tener solo un puesto y ese puesto se identifica al incluir el ID Puesto en la entrada correspondiente de la tabla de Puestos. Además de ser la clave principal para la tabla Puestos, en este ejemplo, el campo ID Puestos también es una clave externa de la tabla Empleados a la tabla Puestos. La base de datos puede usar este campo para correlacionar información de varias tablas y garantizar que cualquier cambio o adición a la base de datos continúe aplicando integridad referencial.

Una vez que haya identificado la clave externa, puede continuar y extraer la información deseada de la base de datos mediante la siguiente consulta:

SELECT NOMBRE, APELLIDOS, TITULO
FROM TBL_EMPLEADOS INNER JOIN TBL_PUESTO
ON TBL_EMPLEADOS.ID_PUESTO = TBL_PUESTO.ID_PUESTO

Estas serian las tablas de nuestra base de datos:


Y al realizar la consulta, nos saldrían los datos respectivos, en este caso:


CREAR CLAVES FORÁNEAS EN SQL SERVER

Técnicamente, no es necesario definir explícitamente la relación para poder realizar consultas como la anterior.

Sin embargo, si define explícitamente la relación usando una restricción de clave externa, la base de datos podrá realizar algún trabajo de limpieza para usted:

  • Cuando agrega un nuevo registro a la tabla Empleados, la base de datos se asegurará de que la ID de puesto que ingrese sea una clave primaria válida en la tabla de Puestos.
  • Si cambia una ID_PUESTO en la tabla TBL_PUESTOS, la base de datos puede realizar las actualizaciones necesarias en la tabla TBL_EMPLEADOS para preservar la coherencia.
  • La base de datos puede proteger contra el impacto de una eliminación de un PUESTO de la tabla de TBL_PUESTOS al rechazar eliminar una posición con las correspondientes entradas de empleados o al realizar una eliminación en cascada de todos los empleados relacionados.

Así es como crearía la clave externa(foranea) en SQL Server:

ALTER TABLE TBL_EMPLEADOS 
ADD FOREIGN KEY (ID_PUESTO) 
REFERENCES TBL_PUESTO (ID_PUESTO)

También puede crear una clave externa cuando crea una tabla agregando la cláusula:

FOREIGN KEY (ID_PUESTO) REFERENCES TBL_PUESTO

POR EJEMPLO:

CREATE TABLE TBL_EMPLEADOS(
 ID_EMPLEADO int identity PRIMARY KEY,
 NOMBRE VARCHAR(50),
 APELLIDOS VARCHAR(50),
 TELEFONO_OFICINA VARCHAR(9),
 TELEFONO_CASA VARCHAR(9),
 ID_PUESTO INT FOREIGN KEY (ID_PUESTO) REFERENCES TBL_PUESTO
)

Espero que les haya gustado, aquí les dejo el código que se realizo en el post.
















CREATE DATABASE CODIGOJAVALIBRE

USE CODIGOJAVALIBRE

CREATE TABLE TBL_PUESTO(
 ID_PUESTO int identity PRIMARY KEY,
 TITULO VARCHAR(50),
 NIVEL_TRABAJO VARCHAR(50),
 CATEGORIA_HABILIDADES VARCHAR(50),
 UBICACION VARCHAR(50),
)

CREATE TABLE TBL_EMPLEADOS(
 ID_EMPLEADO int identity PRIMARY KEY,
 NOMBRE VARCHAR(50),
 APELLIDOS VARCHAR(50),
 TELEFONO_OFICINA VARCHAR(9),
 TELEFONO_CASA VARCHAR(9),
 ID_PUESTO INT FOREIGN KEY (ID_PUESTO) REFERENCES TBL_PUESTO
)

INSERT INTO TBL_PUESTO(TITULO,NIVEL_TRABAJO,CATEGORIA_HABILIDADES,UBICACION)
VALUES('GERENTE DE TI','PROFECIONAL','GESTION DE TI','AREA DE TI')

INSERT INTO TBL_PUESTO(TITULO,NIVEL_TRABAJO,CATEGORIA_HABILIDADES,UBICACION)
VALUES('ASISTENTE DE TI','ASISTENTE','PROGRAMADOR','AREA DE TI')

INSERT INTO TBL_EMPLEADOS(NOMBRE,APELLIDOS,ID_PUESTO)
VALUES('CESAR','GARCIA INFANTE',1)

INSERT INTO TBL_EMPLEADOS(NOMBRE,APELLIDOS,ID_PUESTO)
VALUES('JUAN','ZAPATA CORREA',2)

SELECT NOMBRE, APELLIDOS, TITULO
FROM TBL_EMPLEADOS INNER JOIN TBL_PUESTO
ON TBL_EMPLEADOS.ID_PUESTO = TBL_PUESTO.ID_PUESTO

ALTER TABLE TBL_EMPLEADOS 
ADD FOREIGN KEY (ID_PUESTO) 
REFERENCES TBL_PUESTO (ID_PUESTO)



César GI

About César GI

Lo que me importa es poder enseñar lo poco que se, por que asi como yo aprendo leyendo gracias a las personas que comparten sus conocimiento yo tambien quiero ayudar a la comunidad en español aportando lo poco que he aprendido hasta el momento.