DZone Snippets is a public source code repository. Easily build up your personal collection of code snippets, categorize them with tags / keywords, and share them with the world

Snippets has posted 5883 posts at DZone. View Full User Profile

Claves Foraneas / Foreign Key

07.16.2008
| 8890 views |
  • submit to reddit
        Integridad de datos mediantes claves Foraneas, script que genera las SQL necesarios para garantizar la integridad entre tablas. Poco a poco vamos relacionando parejas de padre e hijo y podemos realizar un arbol de claves foraneas, cuando si borramos un registro del padre, borra y actualiza a los hijos en cascada, si no me explico bien decirme en los comentarios.

<?php
require_once("cabezera/funciones.php");
conectar_mysql();
require_once("cabezera/scripts/constantes.php");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
<title>Untitled Document</title>
</head>

<body>
<?php
$ejecutar = isset($_GET['ejecutar']) && $_GET['ejecutar']=='si';
$tabla_padre = "album";
$tabla_hijo = "fotos";
$campo_padre = "idAlbum";
$campo_hijo = "idAlbum";

$sinIntegridad = 0;

$sql="select * from ".$tabla_hijo;
$resultado = mysql_query($sql);
while($fila = mysql_fetch_array($resultado))
{
	$sql2 = "select * from ".$tabla_padre." where ".$campo_padre." = '".$fila[$campo_hijo]."'";
	//echo $sql2."<br/>";
	$resultado2 = mysql_query($sql2);
	if(mysql_num_rows($resultado2) <= 0)
	{
		$sql3 = "DELETE FROM `".$tabla_hijo."` WHERE `".$campo_hijo."` = '".$fila[$campo_hijo]."' LIMIT 1;";
		if($ejecutar)
		{
			if(mysql_query($sql3)) echo "OK query : ".$sql3."<br />";
			else echo "Error en query : ".$sql3."<br />";
		}
		else
		{
			echo $sql3."<br/>";
		}
		$sinIntegridad++;
	}
}

$sql1="ALTER TABLE `".$tabla_padre."` ADD INDEX ( `".$campo_padre."` ) ";
$sql2="ALTER TABLE `".$tabla_hijo."` ADD INDEX ( `".$campo_hijo."` ) ";
$sql3="ALTER TABLE ".$tabla_hijo." ADD FOREIGN KEY(".$campo_hijo.") REFERENCES ".$tabla_padre." (".$campo_padre.") ON DELETE CASCADE ON UPDATE CASCADE";
if($ejecutar)
{
	if(mysql_query($sql1)) echo "OK query : ".$sql1."<br />";
	else echo "Error en query : ".$sql1."<br />";
	
	if(mysql_query($sql2)) echo "OK query : ".$sql2."<br />";
	else echo "Error en query : ".$sql2."<br />";
	
	if(mysql_query($sql3)) echo "OK query : ".$sql3."<br />";
	else echo "Error en query : ".$sql3."<br />";
}
else
{
	echo $sql1."<br/>";
	echo $sql2."<br/>";
	echo $sql3."<br/>";
}

echo "<br/>".$sinIntegridad." filas sin integridad.<br/>";
?>
<form id="form1" name="form1" method="get" action="">
  <label>
  <input name="ejecutar" type="hidden" id="ejecutar" value="si" />
  <input name="Button" type="button" onclick="location.href=location.href" value="Recargar sin ejecutar nada" />
  <input type="submit" name="button" id="button" value="Ejecutar SQL!" />
  </label>
</form>
<?php
/*
ALTER TABLE fotos_nueva_version ADD FOREIGN KEY(idUsuario) REFERENCES usuarios_portalcocinas (idUsuario) ON DELETE CASCADE ON UPDATE CASCADE

ALTER TABLE relacion_usuario_localidad ADD FOREIGN KEY(idUsuario) REFERENCES usuarios_portalcocinas (idUsuario) ON DELETE CASCADE ON UPDATE CASCADE


ALTER TABLE relacion_usuario_actividad ADD FOREIGN KEY(idUsuario) REFERENCES usuarios_portalcocinas (idUsuario) ON DELETE CASCADE ON UPDATE CASCADE


ALTER TABLE fotos_nueva_version DROP FOREIGN KEY idUsuario_FK;

SHOW CREATE TABLE fotos_nueva_version;
*/
?>
</body>
</html>