Page 1 of 1

FOREIGN KEY

Posted: Mon May 25, 2020 10:41 am
by jgabri
Hola

Estoy atascado intentado crear una foreign key, he creado dos tablas:

cTb[55]:="CREATE TABLE `estudio_ratio` ("
cTb[55]+="`id` int(6) unsigned NOT NULL auto_increment,"
cTb[55]+="`idestudio` int NOT NULL,"
cTb[55]+="`nporcentaje` decimal(4,2) default NULL,"
cTb[55]+="`ningreso` decimal(16,2) default NULL,"
cTb[55]+="`npagos` decimal(16,2) default NULL,"
cTb[55]+="`ntotal` decimal(16,2) default NULL,"
cTb[55]+="`ccliente` varchar(100) default NULL,"
cTb[55]+="`ncliente` int(6) unsigned NOT NULL,"
cTb[55]+="`cnotas` text NULL,"
cTb[55]+="PRIMARY KEY (`id`)"
cTb[55]+=") ENGINE=MyISAM;"


cTb[56]:="CREATE TABLE `gastos` ("
cTb[56]+="`id` int(6) unsigned NOT NULL auto_increment,"
cTb[56]+="`idgastos` int NOT NULL,"
cTb[56]+="`cgasto` char(60) default NULL,"
cTb[56]+="`ngasto` decimal(16,2) default NULL,"
cTb[56]+=" PRIMARY KEY (`id`),"
cTb[56]+=" FOREIGN KEY (`idgastos`) REFERENCES estudio_ratio(`idestudio`) ON DELETE CASCADE"
cTb[56]+=") ENGINE=MyISAM;"

La idea es cuando elimine una fila de la tabla estudio_ratio, se haga el delete en cascade en la tabla gastos, pero algo estoy haciendo mal, que no me funciona, pueden ayudar ?

Un saludo y perdón por las molestias
Gabriel

Re: FOREIGN KEY

Posted: Mon May 25, 2020 7:08 pm
by Armando
Gabriel:

Parece que MyISAM no acepta la integridad referencial.

Code: Select all

Ventajas: MyISAM vs InnoDB

Las principales ventajas de InnoDB son:
◦Soporte de transacciones
◦Bloqueo de registros
◦Nos permite tener las características ACID (Atomicity, Consistency, Isolation and Durability: Atomicidad, Consistencia, Aislamiento y Durabilidad en español), garantizando la integridad de nuestras tablas.
◦Es probable que si nuestra aplicación hace un uso elevado de INSERT y UPDATE notemos un aumento de rendimiento con respecto a MyISAM.

Y las de MyISAM:
◦Mayor velocidad en general a la hora de recuperar datos.
◦Recomendable para aplicaciones en las que dominan las sentencias SELECT ante los INSERT /UPDATE.
[color=#FF0040]◦Ausencia de características de atomicidad ya que no tiene que hacer comprobaciones de la integridad referencial, ni bloquear las tablas para realizar las operaciones, esto nos lleva como los anteriores puntos a una mayor velocidad.
[[/color]/code]

Saludos

Re: FOREIGN KEY

Posted: Tue May 26, 2020 6:43 am
by jgabri
Gracias Armando, tampoco me funciona en tablas InnoDb, algo estoy haciendo mal, que no acaba de funcionar.

Un saludo,
Gabriel

Re: FOREIGN KEY

Posted: Tue May 26, 2020 1:44 pm
by Baxajaun
Gabriel,

http://sql.11sql.com/sql-foreign-key.htm

La clave externa o FOREIGN KEY, es una columna o varias columnas, que sirven para señalar cual es la clave primaria de otra tabla.

La columna o columnas señaladas como FOREIGN KEY, solo podrán tener valores que ya existan en la clave primaria PRIMARY KEY de la otra tabla.

https://programacion.net/articulo/integ ... ysql_263/4

Saludos,

Re: FOREIGN KEY

Posted: Tue May 26, 2020 1:48 pm
by leandro
Una idea

Code: Select all

DELETE etr,gas
FROM estudio_ratio etr 
LEFT JOIN gastos gas 
    ON etr.idestudio = gas.idgastos
WHERE etr.id= 1;
 

Re: FOREIGN KEY

Posted: Tue May 26, 2020 3:17 pm
by Armando
Gabriel:

Otra opción es que hagas un Trigger.

Saludos

Re: FOREIGN KEY

Posted: Wed Jun 03, 2020 10:26 am
by jgabri
Gracias a todos, lo he resuelto de la siguiente forma:

cQuery:= "DELETE estudio_ratio,gastos FROM estudio_ratio JOIN gastos ON estudio_ratio.idestudio=gastos.idgastos WHERE gastos.idgastos='" + Str( nIdGastos ) + " ' "
oVar:oMysql:Execute(cQuery)

Un saludo
Gabriel