FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour FOREIGN KEY
Posts: 29
Joined: Mon Jan 14, 2019 11:43 AM
FOREIGN KEY
Posted: Mon May 25, 2020 10:41 AM

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

Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: FOREIGN KEY
Posted: Mon May 25, 2020 07:08 PM
Gabriel:

Parece que MyISAM no acepta la integridad referencial.

[code]
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.
◦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.
[
/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
Posts: 29
Joined: Mon Jan 14, 2019 11:43 AM
Re: FOREIGN KEY
Posted: Tue May 26, 2020 06:43 AM

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

Un saludo,
Gabriel

Posts: 990
Joined: Wed Oct 19, 2005 02:17 PM
Re: FOREIGN KEY
Posted: Tue May 26, 2020 01:44 PM
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/integridad_referencial_en_mysql_263/4

Saludos,
Posts: 1816
Joined: Wed Oct 26, 2005 02:49 PM
Re: FOREIGN KEY
Posted: Tue May 26, 2020 01:48 PM
Una idea
Code (fw): Select all Collapse
DELETE etr,gas
FROM estudio_ratio etr 
LEFT JOIN gastos gas 
    ON etr.idestudio = gas.idgastos
WHERE etr.id= 1;
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 25.01 ] [ xHarbour 64 bits) ]
Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: FOREIGN KEY
Posted: Tue May 26, 2020 03:17 PM

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
Posts: 29
Joined: Mon Jan 14, 2019 11:43 AM
Re: FOREIGN KEY
Posted: Wed Jun 03, 2020 10:26 AM

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

Continue the discussion