1. 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',
2. '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
3. 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
4. # 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>";
5. 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