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.
1
2 <?php
3 require_once("cabezera/funciones.php");
4 conectar_mysql();
5 require_once("cabezera/scripts/constantes.php");
6 ?>
7 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
8 <html xmlns="http://www.w3.org/1999/xhtml">
9 <head>
10 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
11 <title>Untitled Document</title>
12 </head>
13
14 <body>
15 <?php
16 $ejecutar = isset($_GET['ejecutar']) && $_GET['ejecutar']=='si';
17 $tabla_padre = "album";
18 $tabla_hijo = "fotos";
19 $campo_padre = "idAlbum";
20 $campo_hijo = "idAlbum";
21
22 $sinIntegridad = 0;
23
24 $sql="select * from ".$tabla_hijo;
25 $resultado = mysql_query($sql);
26 while($fila = mysql_fetch_array($resultado))
27 {
28 $sql2 = "select * from ".$tabla_padre." where ".$campo_padre." = '".$fila[$campo_hijo]."'";
29 //echo $sql2."<br/>";
30 $resultado2 = mysql_query($sql2);
31 if(mysql_num_rows($resultado2) <= 0)
32 {
33 $sql3 = "DELETE FROM `".$tabla_hijo."` WHERE `".$campo_hijo."` = '".$fila[$campo_hijo]."' LIMIT 1;";
34 if($ejecutar)
35 {
36 if(mysql_query($sql3)) echo "OK query : ".$sql3."<br />";
37 else echo "Error en query : ".$sql3."<br />";
38 }
39 else
40 {
41 echo $sql3."<br/>";
42 }
43 $sinIntegridad++;
44 }
45 }
46
47 $sql1="ALTER TABLE `".$tabla_padre."` ADD INDEX ( `".$campo_padre."` ) ";
48 $sql2="ALTER TABLE `".$tabla_hijo."` ADD INDEX ( `".$campo_hijo."` ) ";
49 $sql3="ALTER TABLE ".$tabla_hijo." ADD FOREIGN KEY(".$campo_hijo.") REFERENCES ".$tabla_padre." (".$campo_padre.") ON DELETE CASCADE ON UPDATE CASCADE";
50 if($ejecutar)
51 {
52 if(mysql_query($sql1)) echo "OK query : ".$sql1."<br />";
53 else echo "Error en query : ".$sql1."<br />";
54
55 if(mysql_query($sql2)) echo "OK query : ".$sql2."<br />";
56 else echo "Error en query : ".$sql2."<br />";
57
58 if(mysql_query($sql3)) echo "OK query : ".$sql3."<br />";
59 else echo "Error en query : ".$sql3."<br />";
60 }
61 else
62 {
63 echo $sql1."<br/>";
64 echo $sql2."<br/>";
65 echo $sql3."<br/>";
66 }
67
68 echo "<br/>".$sinIntegridad." filas sin integridad.<br/>";
69 ?>
70 <form id="form1" name="form1" method="get" action="">
71 <label>
72 <input name="ejecutar" type="hidden" id="ejecutar" value="si" />
73 <input name="Button" type="button" onclick="location.href=location.href" value="Recargar sin ejecutar nada" />
74 <input type="submit" name="button" id="button" value="Ejecutar SQL!" />
75 </label>
76 </form>
77 <?php
78 /*
79 ALTER TABLE fotos_nueva_version ADD FOREIGN KEY(idUsuario) REFERENCES usuarios_portalcocinas (idUsuario) ON DELETE CASCADE ON UPDATE CASCADE
80
81 ALTER TABLE relacion_usuario_localidad ADD FOREIGN KEY(idUsuario) REFERENCES usuarios_portalcocinas (idUsuario) ON DELETE CASCADE ON UPDATE CASCADE
82
83
84 ALTER TABLE relacion_usuario_actividad ADD FOREIGN KEY(idUsuario) REFERENCES usuarios_portalcocinas (idUsuario) ON DELETE CASCADE ON UPDATE CASCADE
85
86
87 ALTER TABLE fotos_nueva_version DROP FOREIGN KEY idUsuario_FK;
88
89 SHOW CREATE TABLE fotos_nueva_version;
90 */
91 ?>
92 </body>
93 </html>
94