Restricción FOREIGN KEY SQL

 Restricción FOREIGN KEY SQL




En el articulo anterior hablamos sobre las CHECK restricción, especificamos las características sus características, sintaxis, como crearlas e implementarlas en una tabla.  En este nuevo articulo hablaremos de otra restricción muy importante al momento de trabajar con tablas relacionales la Restricción FOREIGN KEY SQL.


Índice

Que es la restriccion FOREIGN KEY SQL 





Que es la restriccion FOREIGN KEY SQL

Una FOREIGN KEY (Clave externa) es una restricción que nos permite unir dos tablas relacionales haciendo referencia a una columna especifica.
 
La FOREIGN KEY hacer referencia al campo que esta declarado como PRIMARY KEY en la otra tabla.

Para aclarar este punto veamos las siguientes dos tablas.

Tabla Autos

Tabla Repuestos Autos

Observemos la tabla "Repuestos_Autos" la columna AutoID hace referencia a la columna Codigo de la "tabla Autos".Ahora visto explicamos lo siguiente :

La columna "AutoID" es la FOREIGN KEY de la tabla "AutosRepuestos".

La columna "Codigo" es la PRIMARY KEY de la tabla "Autos".


La tabla que contiene FOREIGN KEY es denominada tabla secundaria, mientras tanto la tabla que contiene la  PRIMARY KEY  es denominada tabla primaria o principal.

Tanto la tabla secundaria como la tabla principal se mantienen comprobando si  el valor de la FOREIGN KEY(tabla secundaria)  existe en la tabla principal o PRIMARY KEY. Esta comprobación es necesaria para mantener la integridad referencial de la base de datos.

La restricción FOREIGN KEY  nos permite realizar muchas referencias a tablas principales, en cambio en una restricción  PRIMARY KEY solo podemos crear una llave primaria por cada tabla creada. Una foreign key nos es permitido insertar valores nulos siempre y cuando esta no este definida con una restricción NOT NULL.

Con la restricción Foreign Key también podemos controlas Las operaciones y ejecuciones de sentencias que llevemos a cabo sobre las tablas relacionales, es decir si tenemos datos asociados de la tabla principal con la tabla secundaria y ejecutamos sentencias UPDATE O DELETE  esta nos va  enviar error al momento de la ejecución.




Agregar restricción FOREIGN KEY SQL a una tabla nueva

Podemos agregar la restricción Foreign Key al momento de crear una tabla nueva para eso vamos hacer uso de la palabra clave FOREIGN KEY y entre paréntesis definiremos el nombre de la columna que actuara como clave externa y haremos referencia ala tabla con la que vamos a crear la relación mediante la palabra REFERENCES.

Sintaxis

FOREIGN KEY(NOMBRE_COLUMNA) REFERENCES NOMBRE_TABLA(NOMBRECOLUMNA)

A continuación vamos a crear dos tablas de ejemplo. La primer tabla vamos a definir la clave primaria y en la segunda tabla vamos a crear la clave secundaria que hará referencia ala tabla de la clave primaria.

CREATE TABLE Productos(
PRODUCTOID INT IDENTITY NOT NULL,
Nombre VARCHAR(100) NULL,
Marca VARCHAR(80) NULL,
Precio INT NOT NULL,
Existencias DECIMAL(12,2) CHECK(Existencias >0),
PRIMARY KEY(ID),
);
GO

La primera tabla que vamos a crear va contener los registros de productos, la clave primaria de esta table es la columna "PRODUCTOID".

CREATE TABLE VENTASDETALLES(
IDVENTA INT IDENTITY NOT NULL,
PRODUCTOID INT NOT NULL,
PRECIO INT NOT NULL,
CANTIDAD DECIMAL(12,2) NOT NULL,
PRIMARY KEY(IDVENTA),
FOREIGN KEY(PRODUCTOID) REFERENCES Productos(PRODUCTOID),
);
GO

La segunda tabla que vamos a crear almacenara los registros de las ventas de la tabla productos, y acá viene lo interesante esta tabla contiene su clave primaria pero también una llave secundaria la cual hará referencia al ID de la tabla producto.

Ahora creemos las tablas en SQL Server Management Studio.


Ahora que ya hemos creado las tablas, podemos mencionar también que podemos hacer uso de la instrucción CONSTRAINT para declarar tanto la llave primaria como secundaria, para realizarlo debemos utilizar la siguiente sintaxis.

CONSTRAINT PK_NOMBRERESTRICCION PRIMARY KEY(NOMBRE_COLUMNA) 
CONSTRAINT FK_NOMBRERESTRICCION FOREIGN KEY(NOMBRE_COLUMNA) REFERENCES NOMBRE_TABLA(COLUMNA)

Si modificamos las tablas que hemos creado anteriormente y nombramos tanto su llave primaria como secundaria deberían quedar de la siguiente manera:

--CREANDO PRIMERA TABLA PRODUCTOS
CREATE TABLE Productos(
PRODUCTOID INT IDENTITY NOT NULL,
Nombre VARCHAR(100) NULL,
Marca VARCHAR(80) NULL,
Precio INT NOT NULL,
Existencias DECIMAL(12,2) CHECK(Existencias >0),
--NOMBRE DE LA CLAVE PRIMARIA
CONSTRAINT PK_PRODUCTOS_ID PRIMARY KEY(PRODUCTOID),
);
GO


--CREANDO TABLA DETALLE DE VENTAS
CREATE TABLE VENTASDETALLES(
IDVENTA INT IDENTITY NOT NULL,
PRODUCTOID INT NOT NULL,
PRECIO INT NOT NULL,
CANTIDAD DECIMAL(12,2) NOT NULL,
--NOMBRE CLAVE PRIMARIA
CONSTRAINT PK_VENTAS PRIMARY KEY(IDVENTA),
--NOMBRE CLAVE SECUNDIARIA
CONSTRAINT FK_VENTAS FOREIGN KEY(PRODUCTOID) REFERENCES Productos(PRODUCTOID),
);
GO

Para diferenciar una clave primaria de una secundaria podemos usar las Palabras "PK" para la llave primaria en la tabla y la palabra "FK" para nombrar la llave secundaria en la tabla.

Ahora vamos a realizar la inserción de registros en ambas tablas para ver sino tenemos errores. Primeramente vamos a insertar los siguientes registros ala tabla "Productos".

INSERT INTO Productos VALUES('IMPRESORA EPSON L320','EPSON',320,10)
INSERT INTO Productos VALUES('SERVIDOR DELL POWEREDGE T40','DELL INC',840,5)
INSERT INTO Productos VALUES('SWITCH DE 24 PUERTOS','CISCO',200,10)
INSERT INTO Productos VALUES('CARTUCHOS DE TINTA 664','HP',720,300)
INSERT INTO Productos VALUES('DISCO DURO EXTERNO 1TB','ADATA',180,15)

Los siguientes registros insertémoslos en las tablas en SQL Server Management Studio.

Para la primera tabla producto no obtenemos ningún error, si realizamos un SELECT sobre la tabla productos observaremos que los registros han sido guardados.


Ahora insertemos registros en la tabla "VENTASDETALLES".

Si observamos los registros se van a guardar de forma correcta esto debido a que hay campos que hacen referencia ala tabla productos en este caso el campo "PRODUCTOID" de la tabla "VENTASDETALLES".

De no haber columnas que hagan referencia ala tabla primaria obtendremos un error ya que el registros que estaremos tratando de insertar no existe en la tabla primaria veamos un ejemplo. Supongamos que vamos a insertar el detalle de venta de un producto cuyo PRODUCTOID  es 8.




Al tratar de insertar el codigo de producto 8 nos va enviar el siguiente error el cual nos dice que se ha entrado en conflicto con la columna "PRODUCTOID" de la tabla productos y esto es debido a que el codigo que estamos tratando de guardar no existe en la tabla productos. Como mencionábamos al inicio del articulo el manejo de restricciones FOREIGN KEY  en tablas relaciones es muy importante ya que nos garantiza la integridad de los registros en las tablas, además que nos permite obtener consultas mas precisas y saber si en realidad los datos asociados son correctos.

Como nota importante debemos mencionar que:

Una tabla que contiene una llave secundaria, en su campo o columna establecida como FOREIGN KEY no podemos actualizarlo mediante la sentencia UPDATE.

No podemos eliminar los registros de una tabla primaria la cual tiene una llave secundaria asociada en otra tabla.

para eliminar los registros de dos tablas relaciones primeramente debemos eliminar los registros de la tabla secundaria y posteriormente eliminar los de la tabla primaria.



Agregar una restriccion FOREIGN KEY SQL a una tabla existente

para agregar una restricción FOREIGK KEY  a una tabla existente debemos hacer uso de la instrucción ALTER.

Sintaxis
ALTER TABLE NOMBRE_TABLA ADD FOREIGN KEY(NOMBRECOLUMNA) REFERENCES NOMBRE_TABLA(NOMBRECOLUMNA) 

A continuación vamos a crear otra tabla pero no le agregaremos la llave secundaria lo haremos posteriormente. La tabla que vamos a crear se llamara "ProductosSeries" y esta contendrá todo los números de series de la tabla "Productos".

CREATE TABLE PRODUCTOSERIES(
SerieID INT IDENTITY NOT NULL,
PRODUCTOID INT NOT NULL,
NO_SERIE VARCHAR(100) NULL,
MODELO VARCHAR(100) NULL,
CONSTRAINT PK_SERIES PRIMARY KEY(SerieID),
);
GO

Primero vamos a crear la tabla y solamente vamos a definirle la llave primaria. Ahora para agregar la llave secundaria vamos a utilizar la sintaxis anteriormente vista .

ALTER TABLE PRODUCTOSERIES ADD FOREIGN KEY(PRODUCTOID) REFERENCES Productos(PRODUCTOID)

A continuación la tabla y la instrucción vamos a crearlas en Sql Server Management Studio:


Creada la tabla, ahora vamos a agregar la llave secundaria.

Ejecuta la instrucción podemos verificar si se aplicaron los cambios ala tabla, para eso nos vamos ala estructura de la tabla en el administrador de objeto, desplegamos las opciones  Columns y keys. En la opción Columns podemos observar que los campos "SerieID" y "PRODUTOID" ambos tiene un símbolo de una llave ala par, lo que significa que la tabla contiene una llave primaria y una secundaria. y por ultimo en la opción keys podemos ver los nombres que contienen tanto la llave primaria como la llave secundaria.


Eliminar una restriccion FOREIGN KEY SQL de una tabla

Para eliminar una restricción FOREIGN KEY de una tabla debemos utilizar la instrucción DROP.

Sintaxis


ALTER TABLE NOMBRE_TABLA DROP CONSTRAINT NOMBRE_RESTRICCION  

Supongamos que vamos a eliminar la llave secundaria de la tabla "ProductoSeries".

ALTER TABLE PRODUCTOSERIES DROP CONSTRAINT FK__PRODUCTOS__PRODU__2739D489

Ejecutémoslo en Management Studio de SQL:

Verifiquemos la tabla.

La restricción FOREGN KEY se ha eliminado de la tabla "ProductoSeries".


Esperando que el articulo les sea de mucha ayuda hemos concluido un estudio mas sobre instrucciones en SQL. la restricciones Foreign Key son muy importantes al momento de diseñar una base de datos ya que nos permitirá mantener la legibilidad e integridad de los registros almacenados en la base de datos.

Publicar un comentario

0 Comentarios