Blog de diseño, tecnología, programación, internet y curiosidades
| Tweet | Compartir |
|

Muchos habreis tenido problemas al crear tablas relacionadas con MySql, pero de verdad que es bastante sencillo, solo hay que tener en cuenta una serie de premisas:
Es necesario el uso de índices para que la verificación de las claves foráneas sea más rápida. Vamos a ver un ejemplo de una definición de 2 tablas relacionadas. Clientes y privilegios:
De esta manera estamos relacionando la tabla clientes y privilegios por el campo id_cliente.
La clave foránea (FOREIGN KEY) y la Referenciada tienen que tener tipos de datos similares para que puedan ser comparadas sin la necesidad de hacer una conversión de tipos.
Ahora ya tenemos las tablas relacionadas y seguro que os haceis la siguiente pregunta:
"¿Cómo inserto registros en las tablas que tengan claves foráneas (FOREIGN KEYS)?"
Bueno, esta pregunta realmente nos la podemos hacer para cuando se inserta un registro, se borra o se actualiza, ya que en las tres lo tendremos que tener en cuenta.
Ahora vamos a insertar algún registro para verificar que todo está correcto:
Nota: No me pregunteis porque he puesto Ana Botella dentro de esta categoría de clientes
.
Hasta ahora ha ido todo bien, pero ¿que pasaría si intentamos insertar un registro en la tabla "privilegios" en el que nos refiramos a un cliente que no exista en la tabla clientes?, vamos a probarlo:
Pues sí nos tiene que devolver un error tal como este:
"ERROR 1216: Cannot add or update a child row: a foreign key constraint fails"
La razón es bastante evidente, estamos intentando insertar un registro en la tabla privilegios sobre un cliente "id_cliente=5", y hasta el momento no existe.
Ahora vamos a intentar eliminar un registro de la tabla clientes:
Debido a que tenemos la restricción de la clave foránea no permitirá eliminar el registro puesto que se hace referencia a él en la tabla "privilegios", por lo tanto Mysql nos devolvería el siguiente error:
"ERROR 1217: Cannot delete or update a parent row: a foreign key constraint fails"
Para eliminar este tipo de registros con claves foráneas existen lo que se llama eliminación en CASCADA, en la que todos los registros relacionados se eliminan según las relaciones de claves foráneas.
Para llevar a cabo una eliminación de todos los registros relacionados por las claves foráneas en distintas tablas se usa la funcion "ON DELETE CASCADE".
Si se especifica ON DELETE CASCADE, y una fila en la tabla padre es eliminada, entonces se eliminarán las filas de la tabla hijo cuya clave foránea sea igual al valor de la clave referenciada en la tabla padre. Esta acción siempre ha estado disponible en MySQL. Fuente: Mysql-hispano.org
Veamos un ejemplo de eliminación en cascada:
Con esta sentencia, ya tendremos dispuesta la tabla para que se pueda eliminar en cascada. Por lo tanto si queremos eliminar ahora al cliente "Ana Botella", tan sólo tendriamos que ejecutar lo sisguiente:
Si haceis una consulta ahora en las dos bases de datos, "clientes" y "privilegios", vereis como se ha eliminado "Ana Botella" de las dos tablas.
Al igual que la eliminación también podemos actuar en cascada con las actualizaciones con la sentencia "ON UPDATE CASCADE".
Esto es todo, espero ayudaros a entender un poco mejor la integridad referencial en Mysql y la relación entre tablas.
Vía: MySql-Hispano - Integridad referencial en MySQL
| Tweet | Compartir |
|
Colordeu creado a partir de la ambicion de gente joven, esta constituido por personal con experiencia, creativa y motivada, Respaldado por un equipo competente y colaboradores con proyectos importantes en el sector, ofrecemos a nuestros clientes un abanico de posibilidades en cuanto a las nuevas tecnologias. Este blog sobre de diseño, tecnologia, programacion, internet y curiosidades es nuestro caramelito y queremos compartirlo con todos vosotros.

bubu
marzo 20th, 2009 at 1:00 pm
muy buen tuto. muy simple y claro.
lo q mas me gusto fue la image de arriba que tienes con las tablas.
me gustaria saber que programas usas para poder crearlas y ahorrate el trabajo de luego pasar el script???
desde ya gracias.
saludos
admin
marzo 20th, 2009 at 3:13 pm
Tienes varias opciones, pero claro todas las opciones sirven para generar el diagrama después de crear la base de datos:
Db Designer
).
WorkBench
SQL Server 2005 Management Studio (esta opcion es mas cara
En todos estos puedes hacer un DER (Diagrama de Entidad Relacion) y al revés, de un modelo de datos hacerte una tabla.
espero te sirva ...
Un saludo.
lisuloe
abril 2nd, 2009 at 10:49 pm
al momento de querer eliminar es cierto no elimina el registro y es porque no existe la tabla que estas colocando:
DELETE FROM cliente WHERE id_cliente=3; utilizas la tabla "cliente" cuando deberia ser el nombre de la tabla correcta "clientes" como tu lo estas llamando en un inicio al corregir esaconsulta NO ME ELIMINA EL REGISTRO
DELETE FROM clientes WHERE id_cliente=3
Apu
mayo 3rd, 2009 at 5:21 pm
Muy buen tutorial. Muy simple y explicativo. Justo lo que andaba buscando.
Segui asi!!
Carlos
junio 18th, 2009 at 1:44 pm
Buenas admin...necesito que me ayudes...no tengo nada de experiencia en mysql...tengo 2 tablas..y lo que kiero es lo siguiente: que una tabla de "Curso" con la clave "Codigo" tenga varias personas..porque cada vez que registro una persona y kiero registrrar otra en el mismo curso o "codigo" no puedo xq el codigo del curso es el mismo...y sabes que las claves primarias no se duplican...xfa compadre te agradezco la ayuda que me puedas aportar...espero respuesta...
admin
junio 18th, 2009 at 3:52 pm
Hola Carlos,
Me sería de gran ayuda si dijeras mas detalladamente como tienes hechas las tablas con sus campos. Es decir, el tipico CREATE TABLE CURSOS ......
Si estas haciendolo con MySQL, puedes exportar la base de datos a un txt y asi lo podras pegar aqui.
Saludos.
DANIEL MARTINEZ
octubre 24th, 2009 at 12:11 pm
MUY BUEN TUTORIAL ERA LO QUE ESTABA BUSCANDO POR PERSONAS COMO ESTA ES QUE HE PODIDO COMPLETAR ALGUNOS PROYECTOS FELICITACIONES OJALA CONTINUEN AYUDANDO A TODA LA COMUIDAD INFORMATICA.....
GRACIAS....
OSCAR
enero 11th, 2010 at 6:12 am
hola que tal, yo tengo una duda estoy haciedno una pagian en donde se hace un registro de personas, son 4 tablas y 4 pantallas cada tabla va con una pantalla, pero en realidad no se como relacionarlas para al momneot de hacer una busqueda esten relacionadas las tablas y me jale los datos de un usuario y sus datos que le corresponden en cada tabla, yo hago esto pero me marca error:
para la tabla password y pantalla donde crea su user y pass
$que = "INSERT INTO password (USER, PASS FROM password INNER JOIN perfil on password.ID=perfil.ID INNER JOIN escolaridad on password.ID=escolaridad.ID INNER JOIN laboral on password.ID=laboral.ID) ";
tabal perfil don ingresa datos personales:
$que = "INSERT INTO perfil (NOMBRE_S, APELLIDO_PATERNO, APELLIDO_MATERNO, NUMERO_CONTROL, CARRERA_EGRESO, ESPECIALIDAD, SEXO, CALLE, NUMERO, COLONIA, CODIGO_POSTAL, CD, MUNICIPIO, ESTADO, TELEFONO_LADA, E_MAIL, CELULAR, SEMESTRE_EGRESO, ANO_EGRESO, TITULADO FROM password INNER JOIN perfil on password.ID=perfil.ID INNER JOIN escolaridad on password.ID=escolaridad.ID INNER JOIN laboral on password.ID=laboral.ID) "; y y las otras tablas escolaridad y laboral, casi lo mismo pero ya con una sale las otras espero me puedas ayudar
Farru
enero 24th, 2010 at 2:17 pm
Hola,
Trato de hacer esta tabla (orders) en la que enlazo dos empresas diferentes (deste una tabla "company") y 4 contactos diferentes (cogidos de tabla externa "contacts")... Qué pueso estar haciendo mal con las references?
Gracias!
CREATE TABLE IF NOT EXISTS `db`.`orders` (
`id_order` INT(11) NOT NULL AUTO_INCREMENT ,
`id_company` INT(11) NOT NULL ,
`id_related_company` INT(11) NULL DEFAULT NULL ,
`id_contact_1` INT(11) NOT NULL ,
`id_contact_2` INT(11) NULL DEFAULT NULL ,
`id_contact_3` INT(11) NOT NULL ,
`id_contact_4` INT(11) NOT NULL ,
PRIMARY KEY (`id_order`) ,
CONSTRAINT `orders_ibfk_1`
FOREIGN KEY (`id_company` , `id_related_company` )
REFERENCES `db`.`companies` (`id_company` , `id_company` ),
CONSTRAINT `ordenes_ibfk_2`
FOREIGN KEY (`id_contact_1` , `id_contact_2` , `id_contact_3` , `id_contact_4` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
AUTO_INCREMENT = 1
DEFAULT CHARACTER SET = utf8;
CREATE INDEX `id_related_company` ON `db`.`orders` (`id_related_company` ASC) ;
CREATE INDEX `id_company` ON `db`.`orders` (`id_company` ASC) ;
CREATE INDEX `id_contact_1` ON `db`.`orders` (`id_contact_1` ASC) ;
CREATE INDEX `id_contact_2` ON `db`.`orders` (`id_contact_2` ASC) ;
CREATE INDEX `id_contact_3` ON `db`.`orders` (`id_contact_3` ASC) ;
CREATE INDEX `id_contact_4` ON `db`.`orders` (`id_contact_4` ASC) ;
pedro
marzo 11th, 2010 at 11:03 pm
pues yo intento hacer una relacion entre mis tablas en mi web.. pero resulta que TYPE=INNODB no esta.... alguien puede decirme porq a mi no me aparece... ni en mi localhost ni en mi servidor web aparece ese type.. por favor alquien conteste es urgente a mi correo piritudigital@hotmail.com
admin
marzo 11th, 2010 at 11:10 pm
que versión tienes de mysql?
arely
junio 20th, 2010 at 9:01 pm
q son los perfiles en mysql esq m dejaron la investigacion pro noc q sea
andlinux
julio 21st, 2010 at 6:37 pm
hola es buneo saber e enzeñar a los que son novatos en esto de msql (Software libre.. para seres humanos)..tu debes de ser uno de los mejores en programcion programs libres y tambine quiero ser libre como tu ......
bueno me anuncio es : tengo un base de datos llamdo ALFA dentro de este estan los 5 tablas:llamados usuario,clinete,productos,pedidos y detalles de pedidos lo que osea son 5 tablas pero de las cuales yo creo que la tabla usuario no va relacionado con ninguno veradad?? quiero es?.... relacionar las 4 tablas anteriores me pregunta es como colocar las claves primarias y foraneas en tablas ya relacionadas mi relacion es (cliente y pedidos) and (producto y detalle de pedido) and (pedido con detalles de pedido) lo que quiero sabe res como es sintaxis o sentencia que debo poner en tablas deracinadas : no me gusta crear dentro de mysql pero si lo hago en un Editro de texto.....por vafor soy novatos en esto....mi corre es: bradysam"arroba"hotmail.com
andlinux
julio 21st, 2010 at 7:16 pm
CREATE TABLE usuarios
(
id int(5) not null auto_increment,
fecha int(10) not null,
user varchar(50)not null,
pass varchar(32)not null,
mail varchar(50)not null,
primary key(id), // es en estos mi problema
)
------------------
CREATE TABLE clinete
(
id_cli int (5) not null auto_increment,
nombre_cli varchar (50) not null,
apellido_cli varchar(50) not null,
direccion_cli varchar(50) not null,
telefono_cli varchar(16) not null,
email_cli varchar (50) not null
)
//las relaciones esta entre clinete y pedidos
CREATE TABLE pedidos
(
id pedidos int (5) not null auto_increment,
tipo_pe varchar(50) not null,
fecha_pe varchar(10) not null,
direcccion_pe varchar(50) not null,
detalle_pe varchar(50) not null,
ciudad_pe varchar(50) not null,
foto_pe var varcahr(50) not null,// mi promb es en esto de foto tambine exactamente como es tipos de vareables o sentaxis.
id_clinet int (5) es exactamente mi problema como relaciono ??''' es asi no mas o falta algo mas
)
------------------------
CREATE TABLE productos
(
id_pro int (5) not null auto_increment,
nombre_pro varchar(50) not null,
detalle_pro varchar(50) not null,
foto_pro varchar(50) // lo misma pregunta anterior por fa ayuda o otra tabla solo para foto????
cantidad_pro varchar(50),
)
///esto va relacionado con esta tablas (detalle del pedido)
CREATE TABLE dpedido
(
id_dpe int(5) not null auto_increment,
id_pro int (5) not null,
id_pro int(5) not null,
descripción_dpe varchar(50)not null,
detalle_dpe varchar(50)not null,
observacion_dpe varchar(50) not null,
)
//estos son mi tablas por favor.
es asi como van los claves o o como por favor gracias .......
att: brady.........
Estadísticas Septiembre 2010 COLORATE | colorate
octubre 5th, 2010 at 10:52 am
[...] Tutorial Mysql – Relaciones entre tablas y su integridad referencial – 1956 visitas (el mes pasado 1220) [...]
Estadísticas Julio 2010 | colorate
octubre 5th, 2010 at 10:54 am
[...] Tutorial Mysql – Relaciones entre tablas y su integridad referencial – 1220 visitas [...]
Gabriel Agudelo
octubre 22nd, 2010 at 5:32 pm
Esta muy bien explicado, era lo que estaba buscando Muchas Gracias
lo Felicito
Estadísticas Septiembre 2010 COLORATE | colorate
noviembre 2nd, 2010 at 12:12 pm
[...] Tutorial Mysql – Relaciones entre tablas y su integridad referencial - 2230 visitas (el mes pasado 1956) [...]
brendasb
noviembre 25th, 2010 at 2:38 pm
Muchas gracias por laexplicación, es sumamente clara y útil.
admin
noviembre 25th, 2010 at 3:18 pm
Brendasb, de nada
Estadísticas Noviembre 2010 COLORATE | colorate
diciembre 3rd, 2010 at 2:07 pm
[...] Tutorial Mysql – Relaciones entre tablas y su integridad referencial - 2.994 visitas (el mes pasado 2.230) [...]
carlos
diciembre 23rd, 2010 at 12:02 am
Gracias, hace rato estaba buscando una explicación clara, concreta y simple de este tema.
carlos
diciembre 23rd, 2010 at 12:08 am
no logro entrar a mysql hispano, ¿ya no existe? ¿puedo hacerlo de alguna forma?
admin
diciembre 23rd, 2010 at 9:46 am
Hola Carlos,
Pues yo tampoco puedo entrar .. ¿Desde cuando no puedes entrar a la web?..
Estadísticas de COLORATE Enero 2011 | colorate
febrero 7th, 2011 at 12:56 pm
[...] Tutorial Mysql – Relaciones entre tablas y su integridad referencial – 1.898 visitas (el mes de Noviembre 2.230) [...]
Estadísticas de COLORATE Febrero 2011 | colorate
marzo 2nd, 2011 at 5:54 pm
[...] Tutorial Mysql – Relaciones entre tablas y su integridad referencial – 2431 visitas (el mes de Enero 1898) [...]
manguito
marzo 15th, 2011 at 12:47 am
En muy pocos sitios se hallan buenas explicaciones....éste es uno de los pocos.
Bueno, despues del elogio prosigo con la explicación de algo que no le hallo solución todavía.
Estoy tratando de registrar los datos de una guía de remisión en un BD. Tengo:
1. numero de guía de remisión - grID - varchar
2. de (nombre de la persona que hace el envío) - grDE -varchar
3. para (nombre de la persona que recibe la mercadería) - grPARA - varchar
4. cantidad (ej: del producto "x") - grCANT - varchar
5. descripción (ej: del producto "x") - grDESC - text
6. precio (ej: de la cantidad del producto "x") - grPRECIO - int
7. total (ej: suma total de todos precios) - grTOTAL - int
Entonces: lo que deseo es tener el "número de guía de remisión" como llave primaria para luego extraer toda la información de cada guía.....pero cómo?? eso no lo sé.
A mí se me ocurrió algo así:
creé 7 campos
grID - grDE - grPARA - grCANT - grDESC - grPRECIO - grTOTAL
pero solamente habrá una línea de registro para todos los campos menos para grCANT y grDESC porque estos últimos 2 se repetirán más de una vez por la cantidad de artículos.
Me dejo entender?
Bueno, apreciaré mucho la ayuda de cualquier buenalma que esté rondando los predios de este forum.
admin
marzo 15th, 2011 at 2:04 pm
Gracias "manguito", se agradecen mucho estos comentarios.
Hasta donde puedo entender, lo que haría es lo siguiente:
- Una tabla que se llame REMISIONES: Con los siguientes campos (grId, grDe, grPara, grIdProducto, grCant, grTotal)
- Otra tabla que se llame PRODUCTOS: Con los siguientes campos(grIdProducto, grDesc, grPrecio)
Fijate que el campo grIdProducto está en las dos tablas, este es el que actua como relacional, y sería el identificador (clave primaria) de la tabla PRODUCTOS.
Espero que te haya servido.
Amadeo Govoni
marzo 18th, 2011 at 10:19 pm
Estimados
Tengo
- tabla llamada comercio (datos del comercio)
tengo tres tablas
Rubros
Subrubros
Sub_subrubros
Como relaciono estás 3 tablas con la de comercios
Gracias de antemano por la contestación
Una vez relacionada. No puedo recordarme el comercio por el id del comercio
Como hago para insertar con el nombre del comercio insertar en la tabla el id correspondiente
Saludos y gracias de antemano
Amadeo
admin
marzo 21st, 2011 at 7:26 am
pues yo lo que haria es relacionarlas cpn el id de cada una en la tabla
comercio. Es decir:
comercio
--> id_comercio
id_rubros
id_subrubros
id_subsubrubros
otros campos
rubros
-->. id_rubros
id_subrubros
otros campos
subrubros
-->. id_subrubros
otros campos
Cada uno de estos campps va relacionado con su correspondiente en las otraa tablas.
No se si te resuelve esto la duda
Saludos
Estadísticas de COLORATE Marzo 2011 | colorate
abril 12th, 2011 at 9:55 am
[...] Tutorial Mysql – Relaciones entre tablas y su integridad referencial – 2836 visitas (el mes de Marzo 2431) [...]
Estadísticas de COLORATE Abril 2011 | colorate
junio 3rd, 2011 at 7:45 am
[...] Tutorial Mysql – Relaciones entre tablas y su integridad referencial – 3.170 visitas (el mes de Abril 2.836) [...]
joa
julio 6th, 2011 at 1:37 pm
Muy buen tutorial. Que pasaria con los registros de 'clientes' en el caso de que se desee eliminar un registro de la tabla 'privilegios' ?
Gracias
HaroldV
julio 6th, 2011 at 10:15 pm
Excelente Amigo Gracias POr tomarte la Molestia de Explicar Detalladamente =)
Ceci
julio 7th, 2011 at 5:09 pm
Gracias me sirvió de bastante, he estado aprendiendo mysql y me ha costado un poco entender lo de las relaciones, lo explicas de una manera bastante clara, sé que debo practicar más pero es un gran comienzo.
Carrito de compra en PHP, MySql y forma de pago Paypal (Parte 4: Base de datos de un carro de compra) | colorate
agosto 3rd, 2011 at 4:01 pm
[...] que antes de empezar a crear las tablas, os leais un tutorial que publiqué hace un tiempo sobre "Relaciones entre tablas y su integridad referencial" en el que se explica como han de utilizarse las tablas relacionadas con Foreign [...]
ISC. mario ledesma
agosto 22nd, 2011 at 9:15 pm
muy buen tutorial buen amigo. te agradecemos tu valiosa ayuda y tiempo
Athlit
marzo 27th, 2012 at 2:13 pm
Estupendo tutorial. Es imposible explicarlo mejor.
Felicitaciones.