{"id":5331,"date":"2026-01-19T16:59:36","date_gmt":"2026-01-19T15:59:36","guid":{"rendered":"https:\/\/sutilweb.eu\/?page_id=5331"},"modified":"2026-01-19T16:59:37","modified_gmt":"2026-01-19T15:59:37","slug":"44-relaciones-en-mysql","status":"publish","type":"page","link":"https:\/\/sutilweb.eu\/index.php\/lenguajes\/php\/php-practico\/44-relaciones-en-mysql\/","title":{"rendered":"44. Relaciones en MySQL"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">En este cap\u00edtulo veremos como relacionar dos tablas para evitar duplicados. Si tenemos una tabla llamada por ejm <strong><em>reuniones,<\/em><\/strong> en la cual vamos a llamar a diferentes personas a una reuni\u00f3n, y los datos de dichas personas ya est\u00e1n incluidos en otra tabla denominada <strong><em>personas<\/em><\/strong>, podemos incluir en nuestra primera tabla <strong><em>reuniones<\/em><\/strong> un <strong><em>id<\/em><\/strong> que apunte a la tabla <strong><em>personas,<\/em><\/strong> para que en el caso de realizar una consulta podamos extraer los datos que necesitemos de ambas tablas. A este <strong><em>id<\/em><\/strong> lo vamos a denominar <strong>clave<\/strong> o <strong>llave for\u00e1nea<\/strong>, y dicha llave relaciona ambas tablas.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"373\" src=\"https:\/\/sutilweb.eu\/wp-content\/uploads\/2026\/01\/Relaciones-en-MySQL-1024x373.png\" alt=\"\" class=\"wp-image-5334\" srcset=\"https:\/\/sutilweb.eu\/wp-content\/uploads\/2026\/01\/Relaciones-en-MySQL-1024x373.png 1024w, https:\/\/sutilweb.eu\/wp-content\/uploads\/2026\/01\/Relaciones-en-MySQL-300x109.png 300w, https:\/\/sutilweb.eu\/wp-content\/uploads\/2026\/01\/Relaciones-en-MySQL-768x280.png 768w, https:\/\/sutilweb.eu\/wp-content\/uploads\/2026\/01\/Relaciones-en-MySQL-1320x481.png 1320w, https:\/\/sutilweb.eu\/wp-content\/uploads\/2026\/01\/Relaciones-en-MySQL.png 1410w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Como podemos ver,&nbsp;en la tabla <strong><em>reuniones<\/em><\/strong> hemos colocado una \u00faltima columna con la <strong>llave primaria<\/strong> de la tabla <strong><em>contactos,<\/em><\/strong> por lo que ambas tablas quedan relacionadas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para trabajar sobre todo ello ya no vamos a utilizar Workbench, sino que vamos a utilizar la herramienta PHP MyAdmin, la cual instalamos por defecto cuando instalamos el paquete XAMPP. Para acceder a ella hemos de escribir en el navegador la siguiente direcci\u00f3n:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"http:\/\/localhost\/phpmyadmin\">http:\/\/localhost\/phpmyadmin<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Esta herramienta es muy similar a <strong>Workbench,<\/strong> e incluso se puede decir que casi m\u00e1s intuitiva. Vamos a crear una base de datos denominada prueba en la cual crearemos dos tablas, denominadas <strong><em>contactos<\/em><\/strong> y <strong><em>reuniones,<\/em><\/strong> como en la tabla de m\u00e1s arriba. Es importante rese\u00f1ar que la llave for\u00e1nea debe estar creada con el mismo tipo de dato que la clave primaria, sino nos dar\u00e1 error.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Restricciones de llaves for\u00e1neas<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Podemos agregar <strong>restricciones de llaves for\u00e1neas<\/strong> para que no insertemos en la consulta de la llave for\u00e1nea cualquier datos sino solamente los valores correctos. Para ello vamos en nuestro ejm a la tabla <strong><em>reuniones,<\/em><\/strong> elegimos <strong><em>Estructura<\/em><\/strong> y hacemos clic en <strong><em>Vista de relaciones<\/em><\/strong>, y hemos de relacionar la clave for\u00e1nea de nuestra tabla <strong><em>reuniones<\/em><\/strong> con la clave primaria de la tabla <strong><em>contactos<\/em><\/strong>. Desde este punto podremos agregar restricciones a una determinada columna, a esta restricci\u00f3n le tenemos que dar un nombre, por lo general debe ser identificativo. Las llaves for\u00e1neas se suelen referenciar con <strong><em>fk_<\/em><\/strong> seguida de las tablas relacionadas, en nuestro caso <strong><em>fk_reuniones_contactos<\/em><\/strong>. El siguiente paso es determinar a qu\u00e9 columna queremos agregar esta llave for\u00e1nea, en nuestro caso a la columna <strong><em>contactos_id<\/em><\/strong>. Lo siguiente es especificar la tabla y la base de datos a la que voy a hacer referencia, y lo pr\u00f3ximo es escoger la llave primaria a la cual estoy haciendo referencia.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Eliminar registros<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Si intent\u00e1semos eliminar registros que tienen llaves for\u00e1neas, como hemos agregado la restricci\u00f3n de llave for\u00e1nea, no nos va a permitir eliminar porque existe un registro en la tabla de reuniones que hace referencia al registro que tenemos en nuestra base de datos. Para poder eliminar dicha restricci\u00f3n nos dirigimos a la tabla reuniones que es donde hemos creado la restricci\u00f3n de llave for\u00e1nea, y modificar un poco esta llave for\u00e1nea, para ello desde PHPMyAdmin vamos a:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><em>Estructura &gt; Vista de relaciones&nbsp;<\/em><\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Y tenemos que centrarnos en las opciones:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><em>ON DELETE = RESTRICT<\/em><\/strong> (valor por defecto)<\/li>\n\n\n\n<li><strong><em>ON UPDATE = RESTRICT<\/em><\/strong> (valor por defecto)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Normalmente tienen el valor&nbsp;<em><strong>RESTRICT&nbsp;<\/strong><\/em>que es el valor que nos impide eliminar los registros. Adem\u00e1s de <strong><em>STRICT<\/em><\/strong> existen las opciones <strong><em>CASCADE<\/em><\/strong> y <strong><em>SETNULL.<\/em> <em>CASCADE,<\/em><\/strong> cuando eliminemos un registro (por ejm el <strong><em>id = 1<\/em><\/strong>) en la tabla <strong><em>contactos,<\/em><\/strong> tambi\u00e9n se va a eliminar por cascada todas las reuniones que se hayan agendado al <strong><em>id = 1<\/em><\/strong>.&nbsp;Tambi\u00e9n existe la forma en la cual eliminemos el contacto pero no las reuniones agendadas a dicho contacto, para lo cual escogemos la opci\u00f3n <strong><em>SETNULL<\/em><\/strong>. Lo que s\u00ed que hay que hacer es sustituir el valor de la clave for\u00e1nea que se ha borrado por un valor <strong><em>NULL.<\/em><\/strong> No se puede quedar con un valor que no existe. Lo que tenemos que hacer por tanto es ir en la tabla <strong><em>contactos<\/em><\/strong> al campo <strong><em>contactos_id<\/em><\/strong> y permitir que acepte valores nulos.&nbsp;Por \u00faltimo sustituimos el valor <strong><em>RESTRICT<\/em><\/strong> por el valor <strong><em>SETNULL,<\/em><\/strong> de manera que cuando eliminemos dicho contacto, autom\u00e1ticamente en la tabla <strong><em>reuniones<\/em><\/strong> aparecer\u00e1 el valor <strong><em>NULL<\/em><\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La opci\u00f3n <strong><em>CASCADE<\/em><\/strong> permite que si modificamos un registro, se actualice en el resto. Esta opci\u00f3n es muy \u00fatil para no perder la coherencia en la informaci\u00f3n que almacenamos en diferentes tablas.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En este cap\u00edtulo veremos como relacionar dos tablas para evitar duplicados. Si tenemos una tabla llamada por ejm reuniones, en [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":4518,"menu_order":43,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_uag_custom_page_level_css":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-5331","page","type-page","status-publish","hentry"],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"Sutil Web","author_link":"https:\/\/sutilweb.eu\/index.php\/author\/sutilweb\/"},"uagb_comment_info":0,"uagb_excerpt":"En este cap\u00edtulo veremos como relacionar dos tablas para evitar duplicados. Si tenemos una tabla llamada por ejm reuniones, en [&hellip;]","_links":{"self":[{"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages\/5331","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/comments?post=5331"}],"version-history":[{"count":3,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages\/5331\/revisions"}],"predecessor-version":[{"id":5335,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages\/5331\/revisions\/5335"}],"up":[{"embeddable":true,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages\/4518"}],"wp:attachment":[{"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/media?parent=5331"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}