FOREIGN KEY

Post Reply
jgabri
Posts: 17
Joined: Mon Jan 14, 2019 11:43 am

FOREIGN KEY

Post 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
User avatar
Armando
Posts: 2479
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México
Contact:

Re: FOREIGN KEY

Post 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
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
jgabri
Posts: 17
Joined: Mon Jan 14, 2019 11:43 am

Re: FOREIGN KEY

Post by jgabri »

Gracias Armando, tampoco me funciona en tablas InnoDb, algo estoy haciendo mal, que no acaba de funcionar.

Un saludo,
Gabriel
User avatar
Baxajaun
Posts: 853
Joined: Wed Oct 19, 2005 2:17 pm
Location: Gatika. Bizkaia

Re: FOREIGN KEY

Post 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,
User avatar
leandro
Posts: 958
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Contact:

Re: FOREIGN KEY

Post 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;
 
Saludos
LEANDRO ALFONSO
SISTEMAS LYMA - BASE
Bogotá (Colombia)
[ FWH 19.09 ] [ xHarbour 1.2.3 Intl. (SimpLex) (Build 20190613) ] [ Embarcadero C++ 7.30 for Win32 ]
User avatar
Armando
Posts: 2479
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México
Contact:

Re: FOREIGN KEY

Post by Armando »

Gabriel:

Otra opción es que hagas un Trigger.

Saludos
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
jgabri
Posts: 17
Joined: Mon Jan 14, 2019 11:43 am

Re: FOREIGN KEY

Post 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
Post Reply