89 Php. Tablas Inno Db
Upcoming SlideShare
Loading in...5
×
 

89 Php. Tablas Inno Db

on

  • 682 views

 

Statistics

Views

Total Views
682
Slideshare-icon Views on SlideShare
682
Embed Views
0

Actions

Likes
0
Downloads
8
Comments
0

0 Embeds 0

No embeds

Accessibility

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    89 Php. Tablas Inno Db 89 Php. Tablas Inno Db Document Transcript

    • Tablas InnoDB Tipos de tablas Creación de una tabla InnoDB Aunque en los temas anteriores no hemos hecho alusión a ello, MySQL La creación de tablas tipo InnoDB requiere una de estas dos sentencias: permite usar diferentes tipos de tablas tales como: CREATE TABLE IF NOT EXISTS tabla (campo1, campo2,... ) Type=InnoDB s ISAM CREATE TABLE tabla (campo1, campo2,... ) Type=InnoDB MyISAM Este script crear una tabla InnoDB con idénticos campos a los utilizados en el caso de la s s InnoDB tabla demo4 con la que hemos venido trabajando hasta ahora. La sintaxis, muy similar a la utilizada allí es esta: Las tablas ISAM son las de formato más antiguo. Están limitadas a tamaños que no <? superen los 4 gigas y no permite $base="ejemplos"; copiar tablas entre máquinas con $tabla="demoINNO"; distinto sistema operativo. $c=mysql_connect ("localhost","pepe","pepa"); mysql_select_db ($base, $c); Las tablas MySAM son el resultado de la evolución de las anteriores, $crear="CREATE TABLE $tabla ("; ya que resuelven el problema que planteaban las anteriores y son el $crear.="Contador TINYINT(8) UNSIGNED ZEROFILL NOT NULL formato por defecto de MySQL a AUTO_INCREMENT,"; partir de su versión 3.23. $crear.="DNI CHAR(8) NOT NULL, "; $crear.="Nombre VARCHAR (20) NOT NULL, "; Las tablas del tipo InnoDB tienen $crear.="Apellido1 VARCHAR (15) not null, "; una estructura distinta que $crear.="Apellido2 VARCHAR (15) not null, "; MyISAM, ya que utilizan un sólo $crear.="Nacimiento DATE DEFAULT '1970-12-21', "; archivo por tabla en ver de los $crear.="Hora TIME DEFAULT '00:00:00', "; tres habituales en los tipos $crear.="Sexo Enum('M','F') DEFAULT 'M' not null, "; anteriores. $crear.="Fumador CHAR(0) , "; Incorporan un par de ventajas $crear.="Idiomas SET(' Castellano',' Francés','Inglés', importantes, ya que permiten ' Alemán',' Búlgaro',' Chino'), "; realizar transacciones y definir $crear.=" PRIMARY KEY(DNI), "; reglas de integridad referencial. $crear.=" UNIQUE auto (Contador)"; $crear.=")"; Creación y uso de # esta es la única diferencia con el proceso de tablas InnoDB # creación de tablas MyISAM $crear.=" Type=InnoDB"; La creación de tablas de este tipo if(mysql_query ($crear ,$c)) { no presenta ninguna dificultad echo "<h2> Tabla $tabla creada con EXITO </h2><br>"; añadida. El proceso es idéntico a las tablas habituales sin más que }else{ añadir Type=InnoDB después de echo "<h2> La tabla $tabla NO HA PODIDO CREARSE "; cerrar el paréntesis de la sentencia # echo mysql_error ($c)."<br>"; de creación de la tabla. $numerror=mysql_errno ($c); if ($numerror==1050){echo "porque YA EXISTE</h2>";} Una vez creadas, las tablas }; InnoDB se comportan –a efectos mysql_close($c); de uso– exactamente igual que las ?> que hemos venido utilizando en las páginas anteriores. No es preciso hacer ningún tipo de modificación en la sintaxis. Por tanto, es Crear tabla totalmente válido todo lo ya InnoDB comentado respecto a: altas, modificaciones, consultas y bajas. ¡Cuidado! Las transacciones Bajo Windows, al crear una base de datos o tabla InnoDB el nombre de la misma aparecerá Uno de los riesgos que se plantean en minúsculas independientemente de la sintaxis que hayamos utilizado en su creación. en la gestión de bases de datos es que pueda producirse una Si observas el ejemplo anterior, hemos puesto demoINNO como nombre de la tabla. Sin interrupción del proceso mientras embargo, si miras el directorio c:mysql verás que aparece el fichero demoinno.frm con se está actualizando una o varias minúsculas. tablas. Pongamos como ejemplo el cobro de nuestra nómina. Son necesarias dos anotaciones simultáneas: ll cargo en la cuenta Las primeras transacciones del Organismo pagador y el abono en nuestra cuenta bancaria. Si se interrumpiera fortuitamente el <? proceso en el intermedio de las $base="ejemplos"; dos operaciones podría darse la # escribimos el nombre de la tabla en MINUSCULAS circunstancia de que apareciera # para asegurar la compatibilidad entre plataformas registrado el pago sin que se $tabla="demoinno"; llegaran a anotar los haberes en $conexion=mysql_connect("localhost","pepe","pepa"); nuestra cuenta. mysql_select_db ($base, $conexion); # insertamos la sentencia BEGIN para indicar el comienzo Las transacciones evitan este tipo de situaciones ya que los registros # de una transacción de los datos se registran de mysql_query("BEGIN",$conexion); manera provisional y no toman /* hasta que no aparezca una sentencia que finalice la transacción carácter definitivo hasta que una (ROLLBACK ó COMMIT) las modificaciones en la tabla serán registradas instrucción confirme que esas de forma "provisional") */ anotaciones tienen carácter mysql_query("INSERT $tabla (DNI,Nombre,Apellido1,Apellido2, definitivo. Para ello, MySQL Nacimiento,Sexo,Hora,Fumador,Idiomas) dispone de tres sentencias: VALUES BEGIN, COMMIT y ROLLBACK. ('111111','Alvaro','Alonso','Azcárate','1954-11-23',
    • 'M','16:24:52',NULL,3)",$conexion); Sintaxis de las if (mysql_errno($conexion)==0){ transacciones echo "Registro AÑADIDO<br>"; }else{ Existen tres sentencias para if (mysql_errno($conexion)==1062){ gestionar las transacciones. Son echo "No ha podido añadirse el registro <br>"; las siguientes: echo "Ya existe un registro con este DNI<br>"; }else{ mysql_query("BEGIN",$c) $numerror=mysql_errno($conexion); Su ejecución requiere que este $descrerror=mysql_error($conexion); activa la conexión $c con el echo "Se ha producido un error nº $numerror<br>"; servidor de base de datos e indica echo "<br>que corresponde a: $descrerror<br>"; a MySQL que comienza una } transacción. } # indicamos el final de la transacción, en este caso con ROLLBACK Todas las sentencias que se # por lo tanto el registro con DNI 111111 no será insertado en la tabla ejecuten a partir de ella tendrán mysql_query("ROLLBACK",$conexion); carácter provisional y no se # incluyamos una nueva transacción ejecutarán de forma efectiva hasta que encuentre una sentencia de mysql_query("BEGIN",$conexion); finalización. mysql_query("INSERT $tabla (DNI,Nombre,Apellido1,Apellido2, Nacimiento,Sexo,Hora,Fumador,Idiomas) mysql_query("ROLLBACK",$c) VALUES ('222222','Genoveva','Zarabozo','Zitrón','1964-01-14', Mediante esta sentencia 'F','16:18:20',NULL,2)",$conexion); advertimos a MySQL que finaliza la if (mysql_errno($conexion)==0){ transacción pero que no debe echo "Registro AÑADIDO"; hacerse efectiva ninguna de las modificaciones incluidas en ella. }else{ if (mysql_errno($conexion)==1062){ mysql_query("COMMIT",$c) echo "No ha podido añadirse el registro <br>"; echo "Ya existe un registro con este DNI"; Esta sentencia advierte a MySQL }else{ que ha finalizado la transacción y $numerror=mysql_errno($conexion); que debe hacer efectivos todos $descrerror=mysql_error($conexion); los cambios incluidos en ella. echo "Se ha producido un error nº $numerror"; echo "<br>que corresponde a: $descrerror"; Precauciones a tener en } cuenta } # indicamos el final de la transacción, en este caso con COMMIT Cuando se utilizan campos # por lo tanto el registro con DNI 222222 si será insertado en la tabla autoincrementales en tablas mysql_query("COMMIT",$conexion); InnoDB los contadores se van # leamos el contenido de la tabla para ver el resultado incrementando al añadir registros $resultado= mysql_query("SELECT * FROM $tabla" ,$conexion); (incluso de forma provisional) con print "<br>Lectura de la tabla depués del commit<br>"; lo cual si se aborta la inclusión con while ($registro = mysql_fetch_row($resultado)){ un ROLLBACK ese contador foreach($registro as $clave){ mantiene el incremento y en echo $clave,"<br>"; inserciones posteriores partirá de } ese valor acumulado. } Por ejemplo. Si partimos de una mysql_close(); tabla vacía y hacemos una ?> transacción de dos registros (número 1 y número 2 en el campo autoincremental) y la finalizamos con ROLLBACK, no se Ejecutar el ejemplo insertarán pero en una inserción posterior el contador Integridad referencial en tablas InnoDB autoincremental comenzará a partir del valor 2. Cuando se trabaja con varias tablas que tienen algún tipo de vínculo resulta interesante MySQL anuncia que a partir de la disponer de mecanismos que protejan o impidan acciones no deseadas. Supongamos, versión 5.0.3 se incluirá una nueva como veremos en los ejemplos posteriores que pretendemos utilizar una tabla con datos de sentencia para permitir que se alumnos y otra tabla distinta para las calificaciones de esos alumnos. Si no tomamos puedan renumerar los campos ninguna precaución (bien sea mediante los script o mediante el diseño de las tablas) podría autoincrementales. darse la circunstancia de que incluyéramos calificaciones a alumnos inexistentes, en materias de las que no están matriculados, etcétera. También podría darse la circunstancia Elementos necesarios de que diéramos de baja a un alumno pero que se mantuvieran las calificaciones para la integridad vinculadas a él. Todas estas circunstancias suelen producir efectos indeseados y las tablas InnoDB pueden ser diseñadas para prever este tipo de situaciones. referencial Sintaxis para la vinculación de tablas La integridad referencial ha de establecerse siempre entre dos Los vínculos entre tablas suelen establecer en el momento de la creación de la tabla tablas. Una de ellas ha de vinculada. comportarse como tabla principal (suele llamarse tabla padre y la otra sería la tabla vinculada ó CREATE TABLE tabla (campo1, campo2,... tabla hijo. KEY nombre (campo de vinculacion ), FOREIGN KEY (campo de vinculacion) Es imprescindible: REFERENCES nombre_de la tabla principal (Indice primario de la tabla principal) ) Type=InnoDB s Que la tabla principal tenga un índice primario donde el campo de vinculacion ha de ser un índice (no es necesario que sea PRIMARY KEY (PRIMARY KEY) ni UNIQUE) y donde Indice primario de la tabla principal ha de ser un índice primario s Que la tabla vinculada (PRIMARY KEY) de la tabla principal. Debe haber plena coincidencia (tanto en tipos como tenga un índice (no es contenidos) entre ambos índices. necesario que sea ni único ni primario) asociado a campos de tipo idéntico a <? los que se usen para índice $base="ejemplos"; de la tabla principal. $tabla1="principal"; $tabla2="vinculada"; Si observas el código fuente del $c=mysql_connect ("localhost","pepe","pepa"); ejemplo que tienes a la derecha mysql_select_db ($base, $c); podrás observar que utilizamos el # creación de la tabla principal type InnoDB
    • número del DNI (único para $crear="CREATE TABLE IF NOT EXISTS $tabla1 ("; alumno) como elemento de $crear.="DNI CHAR(8) NOT NULL, "; vinculación de la tabla de datos $crear.="Nombre VARCHAR (20) NOT NULL, "; personales con la que incluye las $crear.="Apellido1 VARCHAR (15) not null, "; direcciones. $crear.="Apellido2 VARCHAR (15) not null, "; # el indice primario es imprescindible. Recuerda que debe Borrado de tablas # estar definido sobre campos NO NULOS vinculadas $crear.=" PRIMARY KEY(DNI) "; $crear.=")"; Si pretendemos eliminar una tabla $crear.=" Type=InnoDB"; principal recibiremos un mensaje # creamos la tabla principal comprobando el resultado de error tal como puedes ver si if(@mysql_query ($crear ,$c)){ ejecutas este ejemplo cuyo código print "La tabla ".$tabla1." ha sido creada<br>"; fuente tienes aquí. cómo es lógico, }else{ antes de ejecutarlo habrás de print "No se ha creado ".$tabla1." ha habido un error<br>"; tener creada la tabla cuyo código } fuente tienes a la derecha. # crearemos la tabla vinculada $crear="CREATE TABLE IF NOT EXISTS $tabla2 ("; Las tablas vinculadas si permiten $crear.="IDENTIDAD CHAR(8) NOT NULL, "; el borrado y una vez que éstas ya han sido eliminadas (o quitada la $crear.="calle VARCHAR (20), "; vinculación) ya podrán borrarse sin $crear.="poblacion VARCHAR (20), "; problemas las tablas principales. Si $crear.="distrito VARCHAR(5), "; ejecutas este ejemplo podrás # creamos el índice (lo llamamos asociador) para la vinculación observar que borramos ambas # en este caso no será ni primario ni único tablas siguiendo el orden que # Observa que el campo IDENTIDAD de esta tabla CHAR(8) permite hacerlo. Primero se borra # es idéntico al campo DNI de la tabla principal la vinculada y luego la principal. $crear.=" KEY asociador(IDENTIDAD), "; Este es el código fuente del script. #establecemos la vinculación de ambos índices $crear.=" FOREIGN KEY (IDENTIDAD) REFERENCES $tabla1(DNI) "; ¡Cuidado! $crear.=") TYPE = INNODB"; # creamos (y comprobamos la creación) la tabla vinculada Si has borrado las tablas con if(@mysql_query ($crear ,$c)){ los ejemplos anteriores no print "La tabla ".$tabla2." ha sido creada<br>"; olvides crearlas de nuevo }else{ para poder visualizar los print "No se ha creado ".$tabla2." ha habido un error<br>"; ejemplos siguientes. } mysql_close(); ?> Modificación o borrado de campos vinculados Crear tablas vinculadas Las sentencias MySQL que deban modificar o eliminar campos Modificación de estructuras utilizados para establecer vínculos entre tablas requieren de un La modificación de estructuras en tablas vinculadas puede hacerse de forma idéntica a parámetro especial (CONSTRAINT) la estudiada para los casos generales de MySQL siempre que esas modificaciones no -puede ser distinto en cada una de afecten a los campos mediante los que se establecen las vinculaciones entre las tablas- que es necesario tablas. conocer previamente. La forma de visualizarlo es Aquí tienes un ejemplo en se borran y añaden campos en ambas tablas. Como puedes ver ejecutar la sentencia: SHOW la sintaxis es exactamente la misma que utilizamos en temas anteriores. CREATE TABLE nombre tabla que devuelve como resultado un array <? asociativo con dos índices. Uno de $base="ejemplos"; ellos -llamado Table- que contiene $tabla="principal"; el nombre de la tabla y el otro - Create Table- que contiene la $tabla1="vinculada"; estructura con la que ha sido $c=mysql_connect ("localhost","pepe","pepa"); creada la tabla pero incluyendo el mysql_select_db ($base, $c); parámetro CONSTRAINT seguido de su valor. Ese valor es if(mysql_query("ALTER TABLE $tabla ADD Segundo_Apellido VARCHAR(40)",$c)){ precisamente el que necesitamos print "Sea ha creado el nuevo campo en ".$tabla."<br>"; para hacer modificaciones en los } campos asociados de las tablas if(mysql_query("ALTER TABLE $tabla DROP Apellido2",$c)){ vinculadas. print "Sea ha borrado el campo Apellido 2 en ".$tabla."<br>"; Pulsando en este enlace cuyo } código fuente tienes aquí podrás if(mysql_query("ALTER TABLE $tabla1 ADD DP VARCHAR(5)",$c)){ visualizar el resultado de la print "Sea ha creado el nuevo campo en ".$tabla1."<br>"; ejecución de esa sentencia. } Conocido el valor de parámetro if(mysql_query("ALTER TABLE $tabla1 DROP distrito",$c)){ anterior el proceso de borrado del print "Sea ha borrado el campo distrito en ".$tabla1."<br>"; vínculo actual requiere la siguiente } sintaxis: mysql_close(); ALTER TABLE nombre de la tabla ?> DROP FOREIGN KEY parametro Cuando se trata de añadir un nuevo vínculo con una tabla ejecutar el ejemplo principal habremos de utilizar la siguiente sentencia: En este otro ejemplo determinaremos el valor de CONSTRAINT y modificaremos campos asociados de la tabla vinculada. ALTER TABLE nombre de la tabla ADD [CONSTRAINT parametro] FOREIGN KEY parametro <? REFERENCES tabla principal(clave $base="ejemplos"; primaria) $tabla="vinculada"; $tabla1="principal"; El parámetro CONSTRAIT $c=mysql_connect ("localhost","pepe","pepa"); (encerrado en corchetes en el mysql_select_db ($base, $c); párrafo anterior) es OPCIONAL y $resultado=mysql_query( "SHOW CREATE TABLE $tabla",$c); solo habría de utilzarse en el caso de que existiera ya una vinculación $v=mysql_fetch_array($resultado); previa de esa tabla. # extreamos de Create Table la cadena que empiza por CONSTRAINT
    • # y que acaba por FOREING KEY lo guardamos en el array $coin preg_match ('/CONSTRAINT.*FOREIGN KEY/', $v['Create Table'], $coin); La función preg_match # extraemos el parametro quitando el CONSTRAINT que lleva delante # y el FOREIGN KEY que lleva al final En el ejemplo de la derecha $para=str_replace("FOREIGN KEY",'',str_replace("CONSTRAINT",'',$coin utilizamos esta función cuya [0])); sintaxis es la siguiente: print "El valor de CONSTRAINT es: ".$para."<br>"; preg_match( pat, cad, coin ) # eliminamos el vinculo con la clave externa incluyendo en la sentancia # el valor del parametro obtenido el proceso anterior donde pat es un patrón de if(mysql_query("ALTER TABLE $tabla DROP FOREIGN KEY $para",$c)){ búsqueda, cad es la cadena que la print "Se ha realizado con éxito el borrado del vínculo<br>"; han de realizarse las búsquedas y } coin es un arroay que recoge # añadimos el nuevo vínculo (en este caso rehacemos el anterior todas las coincidencias # pero el proceso es idéntico) encontradas en la cadena. if(mysql_query("ALTER TABLE $tabla ADD CONSTRAINT $para El patrón de búsqueda que hemos FOREIGN KEY(IDENTIDAD) REFERENCES $tabla1(DNI)",$c)){ utilizado en el ejemplo print "Se ha reestablecido con éxito vínculo<br>"; /CONSTRAINT.*FOREIGN KEY/ } debe interpretarse de la siguiente forma. Los caracteres / indican el mysql_close(); comienzo y el final del patrón, el . ?> indica que entre CONSTRAIT y FOREING se permite cualquer carácter para admitir la ejecutar el ejemplo coincidencia y, además, * indica que ese caracter cualquier puede repetirse cero o más veces. Añadir registros a la tabla vinculada ¡Cuidado! Si ejecutas este ejemplo habiendo seguido la secuencia de estos materiales verás que se produce un error nº 1216. Es lógico que así sea porque estamos intentando añadir un Es posible que el script de la registro a la tabla vinculada y ello requeriría que en el campo DNI de la tabla principal derecha te de un error como existiera un registro con un valor igual al que pretendemos introducir en la tabla vinculada. consecuencia de que hemos podido modificar campos en Insertar en tabla Ver script los ejemplos anteriores. Si vinculada eso ocurre, borra aquí las tablas y genéralas de nuevo Añadiremos un registro a la tabla principal con el DNI anterior: pulsando aquí. Insertar en tabla Ver script principal ¡Cuidado! y ahora ya podremos ejecutar -sin errores- el script que inserta datos en la tabla Los resultados que obtengas vinculada. Podremos ejecutar aquel script tantas veces como queramos ya que -el campo el ejecutar los ejemplos de IDENTIDAD está definido como KEY y por tanto permite duplicados- no hemos establecido borrado y modificación de la condición de índice PRIMARIO ó UNICO. datos pueden arrojar resultados distintos según los Borrar o modificar registros en la tabla principal contenidos de las tablas que, a su vez, serán Sin intentamos borrar un registro de la tabla principal mediante un script como el que consecuencia de los tienes en este ejemplo verás que se produce un error nº 1217 advirtiéndonos de que no ejemplos que hayas se realiza el borrado porque existen registros en la tabla vinculada con valores asociados al ejecutado anteriormente y de índice del campo que pretendemos borrar y, de permitir hacerlo, se rompería la integridad la secuencia de los mismos. referencial ya que quedarían registros huérfanos en la tabla vinculada. Siempre puedes volver a las condiciones iniciales de los Borrar en tabla Ver script enlaces de la advertencia principal anterior. Sin tratamos de modificar un registro de la tabla principal y la modificación afecta al índice que realiza la asociación con la tabla (o tablas) vinculadas se produciría -por las Opciones adicionaes de mismas razones y en las mismas circunstancias- un error nº 1217 que impediría la FOREIGN KEY modificación. Modificar DNI en tabla Ver script La claúsula FOREIGN KEY permite principal añadirte -detrás de la definición ya comentada y sin poner coma Si -al tratar de borrar o modificar un registro de la tabla principal– no existieran en la separándola de ella- los parámetros ON DELETE y ON tabla (o tablas vinculadas) registros asociados con él, el proceso de modificación se UPDATE en las que se permite realizaría sin ningún problema y sin dar ningún mensaje de error o advertencia. especificar una de las siguientes opciones: Automatización de procesos ON DELETE RESTRICT Creamos dos tablas idénticas a las anteriores incluyendo algunos datos en ellas. Esta condición (es la condición por defecto de MySQL y no es preciso escribirla) indica a MySQL que <? interrumpa el proeceso de $base="ejemplos"; borrado y de un mensaje de error $tabla1="principal1"; cuando se intente borrar un $tabla2="vinculada1"; registro de la tabla principal $c=mysql_connect ("localhost","pepe","pepa"); cuando en la tabla vinculada mysql_select_db ($base, $c); existan registros asociados al valor # creación de la tabla principal type InnoDB que se pretende borrar. $crear="CREATE TABLE IF NOT EXISTS $tabla1 ("; ON DELETE NO ACTION $crear.="DNI CHAR(8) NOT NULL, "; Es un sinónimo de la anterior. $crear.="Nombre VARCHAR (20) NOT NULL, "; $crear.="Apellido1 VARCHAR (15) not null, "; ON DELETE CASCADE $crear.="Apellido2 VARCHAR (15) not null, "; Cuando se especifica esta opción, $crear.=" PRIMARY KEY(DNI) "; al borrar un registro de la tabla $crear.=")"; principal se borrarán de forma $crear.=" Type=InnoDB"; automática todos los de la tabla # creamos la tabla principal comprobando el resultado vinculada que estuvieran asociados al valor de la clave foránea que se if(@mysql_query ($crear ,$c)){ trata de borrar. Con ello se print "La tabla ".$tabla1." ha sido creada<br>";
    • conseguiría una actualización }else{ automática de la segunda tabla y print "No se ha creado ".$tabla1." ha habido un error<br>"; se mantendría la identidad } referencial. # crearemos la tabla vinculada ON DELETE SET NULL $crear="CREATE TABLE IF NOT EXISTS $tabla2 ("; Con esta opción, al borrar el $crear.="IDENTIDAD CHAR(8) NOT NULL, "; registro de la tabla principal no se $crear.="calle VARCHAR (20), "; borrarían los que tuviera $crear.="poblacion VARCHAR (20), "; asociados la tabla secundaria pero $crear.="distrito VARCHAR(5), "; tomarían valor NULL todos los #creamos la tabla vinculada las opciones de DELETE y UPDATE índices de ella coincidentes con la $crear.=" KEY asociador(IDENTIDAD), "; clave primaria de la tabla principal. #establecemos la vinculación de ambos índices Para el caso de ON UPDATE las $crear.=" FOREIGN KEY (IDENTIDAD) REFERENCES $tabla1(DNI) "; opciones son estas: $crear.=" ON DELETE CASCADE "; $crear.=" ON UPDATE CASCADE "; ON UPDATE RESTRICT $crear.=") TYPE = INNODB"; ON UPDATE CASCADE # creamos (y comprobamos la creación) la tabla vinculada ON UPDATE SET NULL if(@mysql_query ($crear ,$c)){ Su comportamiento es idéntico a print "La tabla ".$tabla2." ha sido creada<br>"; sus homónimas del caso anterior. }else{ print "No se ha creado ".$tabla2." ha habido un error<br>"; ¡Cuidado! } # añadimos registros a la tabla principa1 El uso de la opción SET mysql_query("INSERT $tabla1 (DNI,Nombre,Apellido1,Apellido2) NULL requiere que el campo VALUES ('111111','Robustiano','Iglesias','Pérez')",$c); indicado en FOREIGN KEY mysql_query("INSERT $tabla1 (DNI,Nombre,Apellido1,Apellido2) esté permita valores nulos. Si VALUES ('222222','Ambrosio','Morales','Gómez')",$c); está definido con flag NOT # añadimos registros a la tabla vinculada1 NULL (como ocurre en los mysql_query("INSERT $tabla2 (IDENTIDAD,calle,poblacion,distrito) ejemplos que tienes al VALUES ('111111','Calle Asturias,3','Oviedo','33001')", margen) daría un mensaje de $c); error. mysql_query("INSERT $tabla2 (IDENTIDAD,calle,poblacion,distrito) VALUES ('111111','Calle Palencia,3','Logroño','78541')",$c); mysql_query("INSERT $tabla2 (IDENTIDAD,calle,poblacion,distrito) ¡Cuidado! VALUES ('222222','Calle Anunciación,3','Algeciras','21541')",$c); mysql_close(); Al incluir ON DELETE y ON ?> UPTADE (si se incluyen ambas) han de hacerse por Ver contenidos de este mismo orden. Crear tablas y datos Ver codigo fuente tablas Si se cambiara este orden daría un mensaje de error y no se ejecutarían. Modificar registros en cascada <? $base="ejemplos"; $tabla="principal1"; $conexion=mysql_connect("localhost","pepe","pepa"); mysql_select_db($base,$conexion); # modificamos un registro mysql_query("UPDATE $tabla SET DNI='123456' WHERE DNI='111111'", $conexion); # borramos un registro mysql_query("DELETE FROM $tabla WHERE (DNI='222222')",$conexion); if (mysql_errno($conexion)==0){echo "<h2>Tablas actualizadas</b></H2>"; }else{ print "Ha habido un error al actualizar"; } mysql_close(); ?> Ver contenido de la Actualizar en cascada tabla Para que puedas retornar a las condiciones iniciales, desde este enlace podrás borrar las tablas creadas para actualización en cascada. De esta forma podrás volver a crearlas, cuando desees, en las condiciones iniciales. Anterior Indice Siguiente