{"id":2349,"date":"2020-11-27T00:02:18","date_gmt":"2020-11-27T00:02:18","guid":{"rendered":"http:\/\/manualsqlserver.com\/?p=2349"},"modified":"2020-11-27T00:09:06","modified_gmt":"2020-11-27T00:09:06","slug":"foreign-key-en-sql-server","status":"publish","type":"post","link":"https:\/\/manualsqlserver.com\/?p=2349","title":{"rendered":"Foreign key en SQL Server"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"220\" height=\"260\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys__D.png\" alt=\"\" class=\"wp-image-2350\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Foreign key en SQL Server<\/strong><\/h2>\n\n\n\n<p>Relacionando tablas en SQL Server, para relacionar dos tablas en una base de datos en SQL Server se debe usar la restricci\u00f3n de tipo Foreign Key que permite establecer las reglas de negocio entre dos entidades, lo que se  convierte en la relaci\u00f3n entre dos tablas de la base de datos.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>En este art\u00edculo se muestran ejemplos de como relacionar tablas haciendo uso de la restricci\u00f3n de tipo Foreign Key. Este tipo de relaci\u00f3n va a asegurar la integridad referencial entre las tablas de la base de datos.<\/p>\n\n\n\n<script async=\"\" src=\"\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js\"><\/script>\n<ins class=\"adsbygoogle\" style=\"display:block; text-align:center;\" data-ad-layout=\"in-article\" data-ad-format=\"fluid\" data-ad-client=\"ca-pub-2636008503986218\" data-ad-slot=\"1902193434\"><\/ins>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script>\n\n\n\n<p style=\"font-size:18px\"><strong>Para mayor informaci\u00f3n ver<br><\/strong><a href=\"https:\/\/manualsqlserver.com\/?p=1499\" target=\"_blank\" rel=\"noreferrer noopener\">Restricciones en SQL Server<\/a><br><a href=\"https:\/\/manualsqlserver.com\/?p=117\" target=\"_blank\" rel=\"noreferrer noopener\">Create tablas<\/a><br><a href=\"https:\/\/manualsqlserver.com\/?p=147\" target=\"_blank\" rel=\"noreferrer noopener\">Modificar tablas<\/a><br><a href=\"https:\/\/manualsqlserver.com\/?p=294\" target=\"_blank\" rel=\"noreferrer noopener\">Insertar registros<\/a><br><a href=\"https:\/\/manualsqlserver.com\/?p=300\" target=\"_blank\" rel=\"noreferrer noopener\">Actualizar registros<\/a><\/p>\n\n\n\n<p style=\"font-size:22px\"><strong>Crear y abrir una base de datos.<\/strong><\/p>\n\n\n\n<p>Create database Restricciones<br>go<br>use Restricciones<br>go<\/p>\n\n\n\n<p style=\"font-size:24px\"><strong>Ejercicio 1<\/strong><\/p>\n\n\n\n<p><strong>Relaci\u00f3n Uno &#8211; Muchos<\/strong><br><strong>Creando las tablas y especificando las restricciones al crearlas.<br>Tablas Categorias y Productos, un producto pertenece a una categor\u00eda.<\/strong><\/p>\n\n\n\n<p>Create table Categorias<br>(<br>CategoriasCodigo nchar(5),<br>CategoriasDescripcion nvarchar(50) not null,<br>CategoriasEstado nchar(1) constraint CategoriasEstadoDF default &#8216;A&#8217;,<br>CategoriasFechaCreacion Date constraint CategoriasFechaCreacionDF default GetDate(),<br>constraint CategoriasPK primary key (CategoriasCodigo),<br>constraint CategoriasEstadoCK check (CategoriasEstado = &#8216;A&#8217; or CategoriasEstado = &#8216;E&#8217;),<br>constraint CategoriasFechaCreacionCK check (CategoriasFechaCreacion &gt; GetDate())<br>)<br>go<br><strong>Note que la tabla tiene la restricci\u00f3n Primary key con el campo Codigo, el estado se ha especificado con dos posibles valores A de Activo y E de Eliminado, siendo la restricci\u00f3n CategoriasEstadoDF la que especifica que el valor por defecto es A. Para la fecha de creaci\u00f3n se ha especificado la restricci\u00f3n CategoriasFechaCreacionCK que impide que la fecha sea despu\u00e9s de la fecha actual.<\/strong><\/p>\n\n\n\n<p>Create table Productos<br>(<br>ProductosCodigo nchar(8),<br>ProductosDescripcion nvarchar(50) not null,<br>CategoriasCodigo nchar(5),<br>ProductosPrecio Numeric(9,2) constraint ProductosPrecioDF default 0,<br>ProductosStock Numeric(9,2) constraint ProductosStockDF default 0,<br>ProductosEstado nchar(1) constraint ProductosEstadoDF default &#8216;A&#8217;,<br>constraint ProductosPK primary key (ProductosCodigo),<br>constraint ProductosEstadoCK check (ProductosEstado = &#8216;A&#8217; or ProductosEstado = &#8216;E&#8217;),<br>constraint ProductosPrecioCK check (ProductosPrecio &gt;=0),<br>constraint ProductosStockCK check (ProductosStock &gt;=0),<br>constraint ProductosCategoriasFK Foreign key (CategoriasCodigo)<br>references Categorias(CategoriasCodigo)<br>)<br>go<br>El diagrama entre las dos tabla se muestra en la siguiente imagen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_01.png\" alt=\"\" class=\"wp-image-2351\" width=\"725\" height=\"304\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_01.png 729w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_01-300x126.png 300w\" sizes=\"auto, (max-width: 725px) 100vw, 725px\" \/><\/figure>\n\n\n\n<p style=\"font-size:24px\"><strong>Ejercicio 2<\/strong><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Relaci\u00f3n Uno &#8211; Muchos con varios atributos<\/strong><\/p>\n\n\n\n<p><strong>Clientes, Facturas, Detalle de Facturas y Productos<br>Una factura es generada por un empleado, no se va a crear a\u00fan la tabla de empleados para luego ver como se agregan campos y restricciones Foreign Key en tablas ya creadas.<\/strong><\/p>\n\n\n\n<p>Create table Clientes<br>(<br>ClientesCodigo nchar(15),<br>ClientesNombre nvarchar(100) not null,<br>ClientesDireccion nvarchar(200),<br>constraint ClientesPK Primary key (ClientesCodigo)<br>)<br>go<br>Create table Facturas<br>(<br>FacturasNumeroSerie nchar(5),<br>FacturasNumeroFactura nchar(7),<br>FacturasFecha DateTime,<br>FacturasMontoSinIGV Numeric(9,2),<br>FacturasPorcentajeDeIGV Numeric(8,5),<br>ClientesCodigo nchar(15),<br>FacturasMontoIGV As (FacturasMontoSinIGV * FacturasPorcentajeDeIGV),<br>FacturasMontoTotal As (FacturasMontoSinIGV + FacturasMontoSinIGV * FacturasPorcentajeDeIGV )<br>constraint FacturasPK primary key (FacturasNumeroSerie, FacturasNumeroFactura),<br>constraint FacturasClienteFK Foreign key (ClientesCodigo)<br>references Clientes(ClientesCodigo)<br>)<br>go<\/p>\n\n\n\n<p><strong>Tabla Detalle de Factura<\/strong><br>Create table DetalleFactura<br>(<br>FacturasNumeroSerie nchar(5),<br>FacturasNumeroFactura nchar(7),<br>ProductosCodigo nchar(8),<br>ProductosDescripcion nvarchar(100),<br>DetalleCantidadVendida Numeric(9,2),<br>DetallePrecioVenta Numeric(9,2),<br>DetalleOImporte As (DetalleCantidadVendida * DetallePrecioVenta)<br>constraint DetalleFacturaPK Primary key<br>(FacturasNumeroSerie,FacturasNumeroFactura,ProductosCodigo),<br>constraint DetalleFacturaFacturasFK<br>Foreign key (FacturasNumeroSerie,FacturasNumeroFactura)<br>references Facturas (FacturasNumeroSerie,FacturasNumeroFactura),<br>constraint DetalleFacturaProductosFK Foreign key (ProductosCodigo)<br>references Productos (ProductosCodigo)<br>)<br>go<br><strong>El diagrama para el ejercicio 2 (incluye Categor\u00edas) se muestra en la siguiente imagen.<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_02.png\" alt=\"\" class=\"wp-image-2352\" width=\"741\" height=\"766\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_02.png 857w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_02-290x300.png 290w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_02-768x794.png 768w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_02-795x822.png 795w\" sizes=\"auto, (max-width: 741px) 100vw, 741px\" \/><\/figure>\n\n\n\n<p style=\"font-size:24px\"><strong>Ejercicio 3<\/strong><\/p>\n\n\n\n<p style=\"font-size:22px\"><strong>Relaci\u00f3n recursiva<\/strong><\/p>\n\n\n\n<p><strong>Una relaci\u00f3n recursiva se crea cuando la tabla se relaciona consigo misma. Tabla Empleados, un empleado es el jefe de otro y est\u00e1 en la misma tabla, en este caso se va a crear una relaci\u00f3n recursiva entre el empleado jefe y sus subordinados.<\/strong><\/p>\n\n\n\n<p>Create table Empleados<br>(<br>EmpleadosCodigo nchar(4),<br>EmpleadosPaterno nvarchar(50) not null,<br>EmpleadosMaterno nvarchar(50) not null,<br>EmpleadosNombres nvarchar(50) not null,<br>EmpleadosFechaNacimiento Date,<br>EmpleadosSexo nchar(1),<br>EmpleadosCodigoJefe nchar(4),<br>constraint EmpleadosPK primary key (EmpleadosCodigo),<br><strong>constraint EmpleadosEmpleadosFK foreign key (EmpleadosCodigoJefe)<br>references Empleados(EmpleadosCodigo),<\/strong><br>constraint EmpleadosSexoCK check (EmpleadosSexo = &#8216;F&#8217; or EmpleadosSexo = &#8216;M&#8217;)<br>)<br>go<br>El diagrama para el ejercicio 3 se muestra en la siguiente imagen. Note que se han incluido dos campos EmpleadosCodigo y EmpleadosCodigoJefe para crear la relaci\u00f3n recursiva.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_03.png\" alt=\"\" class=\"wp-image-2353\" width=\"621\" height=\"560\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_03.png 429w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_03-300x271.png 300w\" sizes=\"auto, (max-width: 621px) 100vw, 621px\" \/><\/figure>\n\n\n\n<p style=\"font-size:24px\"><strong>Ejercicio 4<\/strong><\/p>\n\n\n\n<p><strong>Agregar restricci\u00f3n FK a una tabla existente.<\/strong><br>Relacionar la tabla Facturas del ejercicio 2 con Empleados, un empleado registra una factura.<br><strong>Pasos:<\/strong><br><strong>Primero:<\/strong> Agregar el campo en la tabla Facturas, es recomendable que el campo sea tenga mismo nombre de la tabla de Empleados, lo que s\u00ed debe ser obligatorio es que el tipo de campo sea el mismo.<br><strong>Segundo:<\/strong> Agregar la restricci\u00f3n FK entre las dos tablas.<\/p>\n\n\n\n<p>Alter table Facturas Add EmpleadosCodigo nchar(4) not null<br>go<br>Alter table Facturas Add constraint FacturasEmpleadosFK<br>Foreign key (EmpleadosCodigo)<br>references Empleados (EmpleadosCodigo)<br>go<br>El diagrama para el ejercicio 4 se muestra en la siguiente imagen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_04-1024x646.png\" alt=\"\" class=\"wp-image-2354\" width=\"718\" height=\"453\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_04-1024x646.png 1024w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_04-300x189.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_04-768x485.png 768w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_04-795x502.png 795w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_04.png 1166w\" sizes=\"auto, (max-width: 718px) 100vw, 718px\" \/><\/figure>\n\n\n\n<p style=\"font-size:24px\"><strong>Ejercicio 5<\/strong><\/p>\n\n\n\n<p>Agregar una restricci\u00f3n FK entre tablas con registros, considerando que algunos de los registros existentes no cumplen con la restricci\u00f3n. Lo que es necesario es agregar la restricci\u00f3n sin que se compruebe la integridad referencial de los registros existentes.<br>Para este ejercicio se van a agregar registros en la tabla Empleados, luego se va a crear la tabla Departamentos y luego establecer la relaci\u00f3n, hay que resaltar que al establecer la relaci\u00f3n en la tabla Empleados no se va a especificar el c\u00f3digo del departamento que es la clave for\u00e1nea.<\/p>\n\n\n\n<p><strong>Registros en Empleados sin Departamento<\/strong><\/p>\n\n\n\n<p>set dateformat dmy<br>insert into Empleados values<br>(&#8216;0001&#8242;,&#8217;Luque&#8217;,&#8217;S\u00e1nchez&#8217;,&#8217;Fernando&#8217;,&#8217;23\/07\/1966&#8242;,&#8217;M&#8217;,Null),<br>(&#8216;0002&#8242;,&#8217;Mendoza&#8217;,&#8217;Cevallos&#8217;,&#8217;Carlos&#8217;,&#8217;14\/07\/1986&#8242;,&#8217;M&#8217;,&#8217;0001&#8242;),<br>(&#8216;0003&#8242;,&#8217;Sandoval&#8217;,&#8217;Terranova&#8217;,&#8217;Raquel&#8217;,&#8217;08\/03\/1990&#8242;,&#8217;F&#8217;,&#8217;0001&#8242;),<br>(&#8216;0004&#8242;,&#8217;Villacorta&#8217;,&#8217;P\u00e9rez&#8217;,&#8217;Antonio&#8217;,&#8217;13\/06\/1974&#8242;,&#8217;M&#8217;,&#8217;0003&#8242;),<br>(&#8216;0005&#8242;,&#8217;Pereda&#8217;,&#8217;Ch\u00e1vez&#8217;,&#8217;Ingrid&#8217;,&#8217;10\/02\/1999&#8242;,&#8217;F&#8217;,&#8217;0003&#8242;),<br>(&#8216;0006&#8242;,&#8217;Zapata&#8217;,&#8217;S\u00e1nchez&#8217;,&#8217;Luis&#8217;,&#8217;19\/09\/1970&#8242;,&#8217;M&#8217;,&#8217;0003&#8242;)<br>go<\/p>\n\n\n\n<p><strong>Crear y agregar registros a la tabla Departamentos<\/strong><br>Create table Departamentos<br>(<br>DepartamentosCodigo nchar(5),<br>DepartamentosDescripcion nvarchar(50) not null,<br>DepartamentosEstado nchar(1) constraint DepartamentosEstadoDF default &#8216;A&#8217;,<br>constraint DepartamentosPK primary key (DepartamentosCodigo),<br>constraint DepartamentosEstadoCK check (DepartamentosEstado = &#8216;A&#8217; or DepartamentosEstado = &#8216;E&#8217;)<br>)<br>go<br><strong>Registros en Departamentos<\/strong><br>insert into Departamentos values<br>(&#8216;D0101&#8242;,&#8217;Gerencia General&#8217;,&#8217;A&#8217;),<br>(&#8216;D0102&#8242;,&#8217;Administraci\u00f3n&#8217;,&#8217;A&#8217;),<br>(&#8216;D0201&#8242;,&#8217;Producci\u00f3n&#8217;,&#8217;A&#8217;),<br>(&#8216;D0202&#8242;,&#8217;Ventas&#8217;,&#8217;A&#8217;),<br>(&#8216;D0203&#8242;,&#8217;Planificaci\u00f3n y control&#8217;,&#8217;A&#8217;),<br>(&#8216;D0301&#8242;,&#8217;Finanzas y Presupuesto&#8217;,&#8217;A&#8217;)<br>go<br><strong>Agregar la relaci\u00f3n (Foreign key) entre las tablas Empleados y Departamentos<br><\/strong>Alter table Empleados add DepartamentosCodigo nchar(5)<br>go<br>Alter table Empleados add constraint<br>EmpleadosDepartamentosFK foreign key (DepartamentosCodigo)<br>references Departamentos (DepartamentosCodigo)<br>go<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"770\" height=\"406\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_05.png\" alt=\"\" class=\"wp-image-2355\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_05.png 770w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_05-300x158.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_05-768x405.png 768w\" sizes=\"auto, (max-width: 770px) 100vw, 770px\" \/><\/figure>\n\n\n\n<p><br>El listado de los empleados<br>select * from Empleados<br>go<br>El resultado se muestra en la siguiente imagen.<br>Note que en el c\u00f3digo del departamento todos los empleados tienen el valor Null. Es necesario corregir uno por uno.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_06-1024x177.png\" alt=\"\" class=\"wp-image-2356\" width=\"815\" height=\"141\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_06-1024x177.png 1024w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_06-300x52.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_06-768x132.png 768w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_06-795x137.png 795w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_06.png 1386w\" sizes=\"auto, (max-width: 815px) 100vw, 815px\" \/><\/figure>\n\n\n\n<p><strong>Insertar un empleado sin departamento<\/strong><br>insert into Empleados<br>([EmpleadosCodigo], [EmpleadosPaterno], [EmpleadosMaterno],<br>[EmpleadosNombres], [EmpleadosFechaNacimiento],<br>[EmpleadosSexo], [EmpleadosCodigoJefe])<br>values<br>(&#8216;0007&#8242;,&#8217;Rojas&#8217;,&#8217;Alvarado&#8217;,&#8217;M\u00f3nica&#8217;,&#8217;06\/02\/1997&#8242;,&#8217;F&#8217;,&#8217;0001&#8242;)<br>go<br>Insertar un empleado con un c\u00f3digo de Departamento que no existe.<br>insert into Empleados<br>([EmpleadosCodigo], [EmpleadosPaterno], [EmpleadosMaterno],<br>[EmpleadosNombres], [EmpleadosFechaNacimiento],<br>[EmpleadosSexo], [EmpleadosCodigoJefe], [DepartamentosCodigo])<br>values<br>(&#8216;0008&#8242;,&#8217;Casanova&#8217;,&#8217;Llanos&#8217;,&#8217;Julio&#8217;,&#8217;11\/04\/1988&#8242;,&#8217;M&#8217;,&#8217;0001&#8242;,&#8217;D0010&#8242;)<br>go<br>Mensaje:<\/p>\n\n\n\n<p class=\"has-vivid-red-color has-text-color\"><strong>Msg 547, Level 16, State 0, Line 209<br>Instrucci\u00f3n INSERT en conflicto con la restricci\u00f3n FOREIGN KEY &#8216;EmpleadosDepartamentosFK&#8217;. El conflicto ha aparecido en la base de datos &#8216;Restricciones&#8217;, tabla &#8216;dbo.Departamentos&#8217;, column &#8216;DepartamentosCodigo&#8217;.<br>Se termin\u00f3 la instrucci\u00f3n.<\/strong><\/p>\n\n\n\n<p><strong>Insertar un empleado con un c\u00f3digo de Departamento que SI existe.<\/strong><br>insert into Empleados<br>([EmpleadosCodigo], [EmpleadosPaterno], [EmpleadosMaterno],<br>[EmpleadosNombres], [EmpleadosFechaNacimiento],<br>[EmpleadosSexo], [EmpleadosCodigoJefe], [DepartamentosCodigo])<br>values<br>(&#8216;0008&#8242;,&#8217;Casanova&#8217;,&#8217;Llanos&#8217;,&#8217;Julio&#8217;,&#8217;11\/04\/1988&#8242;,&#8217;M&#8217;,&#8217;0001&#8242;,&#8217;D0102&#8242;)<br>go<br>El listado de los empleados<br>select * from Empleados<br>go<br>El resultado se muestra en la siguiente imagen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_07-1024x217.png\" alt=\"\" class=\"wp-image-2357\" width=\"853\" height=\"180\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_07-1024x217.png 1024w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_07-300x64.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_07-768x163.png 768w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_07-795x168.png 795w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_07.png 1393w\" sizes=\"auto, (max-width: 853px) 100vw, 853px\" \/><\/figure>\n\n\n\n<p>Actualizar el registro con c\u00f3digo 0001 asignando el departamento de Gerencia General con c\u00f3digo D0101<br>Update Empleados Set DepartamentosCodigo = &#8216;D0101&#8217;<br>where EmpleadosCodigo = &#8216;0001&#8217;<br>go<\/p>\n\n\n\n<p style=\"font-size:24px\"><strong>Ejercicio 6<\/strong><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Relaci\u00f3n Muchos &#8211; Muchos<\/strong><\/p>\n\n\n\n<p>En una relaci\u00f3n muchos &#8211; muchos se deben crear tres tablas, en una de estas se establecen las claves for\u00e1neas de las otras dos adicionando los atributos propios de la relaci\u00f3n.<br>Para el tipo de relaci\u00f3n muchos a muchos se va a crear una tabla de Proyectos, donde varios empleados pueden ser asignados a un proyecto y  varios proyectos pueden ser asignados a un empleado. Se crear\u00e1 la tabla de Proyectos y EmpleadosProyectos<\/p>\n\n\n\n<p>Create table Proyectos<br>(<br>ProyectosCodigo nchar(6),<br>ProyectosDescripcion nvarchar(50) not null,<br>ProyectosEstado nchar(1) constraint ProyectosEstadoDF default &#8216;A&#8217;,<br>ProyectosFechaInicio Date,<br>ProyectosDuracionMeses Numeric(9,2),<br>constraint ProyectosPK primary key (ProyectosCodigo),<br>constraint ProyectosEstadoCK check (ProyectosEstado = &#8216;A&#8217; or ProyectosEstado = &#8216;E&#8217;)<br>)<br>go<\/p>\n\n\n\n<p><strong>La tabla empleados ya est\u00e1 creada en el ejercicio 3.<\/strong><\/p>\n\n\n\n<p><strong>La tabla de Proyectos Empleados<br><\/strong>Create table ProyectosEmpleados<br>(<br>EmpleadosCodigo nchar(4),<br>ProyectosCodigo nchar(6),<br>ProyectosEmpleadosEstado nchar(1)<br>constraint ProyectosEmpleadosEstadoDF default &#8216;A&#8217;,<br>ProyectosEmpleadosRol nvarchar(20),<br>ProyectosEmpleadosMetodologia nvarchar(30),<br>constraint ProyectosEmpleadosPK primary key (EmpleadosCodigo, ProyectosCodigo),<br>constraint ProyectosEmpleadosEstadoCK check<br>(ProyectosEmpleadosEstado = &#8216;A&#8217; or ProyectosEmpleadosEstado = &#8216;E&#8217;),<br>constraint ProyectosEmpleadosEmpleadosFK Foreign key (EmpleadosCodigo)<br>references Empleados(EmpleadosCodigo),<br>constraint ProyectosEmpleadosProyectosFK Foreign key (ProyectosCodigo)<br>references Proyectos(ProyectosCodigo)<br>)<br>go<br>El diagrama para la relaci\u00f3n muchos a muchos se muestra en la siguiente imagen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_08-1024x465.png\" alt=\"\" class=\"wp-image-2358\" width=\"790\" height=\"358\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_08-1024x465.png 1024w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_08-300x136.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_08-768x349.png 768w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_08-795x361.png 795w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_08.png 1042w\" sizes=\"auto, (max-width: 790px) 100vw, 790px\" \/><\/figure>\n\n\n\n<p style=\"font-size:22px\"><strong>Desactivar una restricci\u00f3n Foreign key<\/strong><\/p>\n\n\n\n<p>No se recomienda desactivar las restricciones de tipo Foreign key, pero la forma de desactivar es usando la cl\u00e1usula Nocheck en la instrucci\u00f3n Alter Table.<br><strong>Desactivar la FK EmpleadosDepartamentosFK<\/strong><br>Alter table Empleados nocheck constraint EmpleadosDepartamentosFK<br>go<br>El inconveniente es que se pueden insertar o editar registros con c\u00f3digos de departamentos que no existen.<br>Se va a insertar un empleado con el departamento con c\u00f3digo D1234, que no existe en la tabla Departamentos.<br>insert into Empleados<br>([EmpleadosCodigo], [EmpleadosPaterno], [EmpleadosMaterno],<br>[EmpleadosNombres], [EmpleadosFechaNacimiento],<br>[EmpleadosSexo], [EmpleadosCodigoJefe], [DepartamentosCodigo])<br>values<br>(&#8216;0009&#8242;,&#8217;Campos&#8217;,&#8217;Segura&#8217;,&#8217;Carmela&#8217;,&#8217;01\/05\/1977&#8242;,&#8217;F&#8217;,&#8217;0002&#8242;,&#8217;D1234&#8242;)<br>go<br>El listado de los empleados<br>select * from Empleados<br>go<br>El resultado se muestra en la siguiente imagen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_09-1024x344.png\" alt=\"\" class=\"wp-image-2359\" width=\"778\" height=\"261\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_09-1024x344.png 1024w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_09-300x101.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_09-768x258.png 768w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_09-795x267.png 795w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_ForeignKeys_09.png 1398w\" sizes=\"auto, (max-width: 778px) 100vw, 778px\" \/><\/figure>\n\n\n\n<p style=\"font-size:22px\"><strong>Activar una restricci\u00f3n Foreign key<\/strong><\/p>\n\n\n\n<p>Para activar la restricci\u00f3n de tipo FK se usa la cl\u00e1usula Check Constraint de la instrucci\u00f3n Alter Table.<br>Alter table Empleados <strong>check constraint<\/strong> EmpleadosDepartamentosFK<br>go<\/p>\n\n\n\n<p style=\"font-size:22px\"><strong>Eliminar una restricci\u00f3n Foreign key<\/strong><\/p>\n\n\n\n<p>No se recomienda eliminar las restricciones FK, para eliminar se utiliza la cl\u00e1usula Drop constraint de la instrucci\u00f3n Alter table.<br>Alter table Empleados drop constraint EmpleadosDepartamentosFK<br>go<\/p>\n\n\n\n<script async=\"\" src=\"\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js\"><\/script>\n<ins class=\"adsbygoogle\" style=\"display:block; text-align:center;\" data-ad-layout=\"in-article\" data-ad-format=\"fluid\" data-ad-client=\"ca-pub-2636008503986218\" data-ad-slot=\"1902193434\"><\/ins>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>Foreign key en SQL Server Relacionando tablas en SQL Server, para relacionar dos tablas en una base de datos en SQL Server se debe usar la restricci\u00f3n de tipo Foreign Key que permite establecer las reglas de negocio entre dos entidades, lo que se convierte en la relaci\u00f3n entre dos tablas de la base de &hellip; <\/p>\n<p><a class=\"more-link btn\" href=\"https:\/\/manualsqlserver.com\/?p=2349\">Seguir leyendo<\/a><\/p>\n","protected":false},"author":1,"featured_media":2350,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[106,160,268],"class_list":["post-2349","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-esquemastablas","tag-alter-table","tag-constraint","tag-foreign-key","nodate","item-wrap"],"_links":{"self":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/2349","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2349"}],"version-history":[{"count":2,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/2349\/revisions"}],"predecessor-version":[{"id":2363,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/2349\/revisions\/2363"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/media\/2350"}],"wp:attachment":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2349"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2349"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2349"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}