Ver índice
Importación / exportación de datos

        Ocultar índice  

   Índice de contenidos
   Instalación en Windows
   Instalación en Ubuntu
   Servidores seguros
   Páginas dinámicas
   Sintaxis básica
   Operaciones
   Arrays
   Formatos de presentación
   Operadores
   Bucles
   Extraer y ord. información
   Funciones
   Ficheros externos
   Imágenes dinámicas
   Gestión de directorios
   Cookies y sesiones
   Clases y objetos
   Ficheros en formato PDF
   Bases de datos MySQL
   PHP y XML
   PDO - Bases SQLite / MySQL
   MySQL a traves de misqli
   Algo de JavaScript y AJAX


Definición de tablas

En este ejemplo de tablas vinculadas con integridad relacional vamos a proponer la situación cuyo esquema puedes ver en el gráfico y cuya descripción es la siguiente:

Estructura de tablas y relaciones

Para desarrollar los ejemplos de este capítulo vamos a crear las tablas, cuyas estructuras e interrelaciones que puedes ver en el código fuente siguiente:

<?php
$base="ejemplos";
$c=mysql_connect ("localhost","pepe","pepa");
mysql_select_db ($base, $c); 
###############################################
# Creación de la tabla nombres con indice primario DNI
# tabla de nombres con índice primario en DNI
###############################################
$crear="CREATE TABLE IF NOT EXISTS alumnos (";
$crear.="DNI CHAR(8) NOT NULL,  ";
$crear.="Nombre VARCHAR (20)  NOT NULL, ";
$crear.="Apellido1 VARCHAR (15)  not null, ";
$crear.="Apellido2 VARCHAR (15)  not null, ";
$crear.=" PRIMARY KEY(DNI) ";
$crear.=")";
$crear.=" Type=InnoDB";
if(mysql_query ($crear ,$c)){
	print "tabla <b>nombres</b> creada<BR>";
}else{
	print "ha habido un error al crear la tabla  <b>alumnos</b><BR>";
}
###############################################
# Creación de la tabla direcciones
# tabla de nombres con índice único en DNI
# para evitar dos direcciones al mismo alumno
# y clave foránea nombres(DNI)
# para evitar direcciones no asociadas a un alumno
# concreto. Se activa la opción de actualizar
# en cascada y de borrar en cascada
###############################################
$crear="CREATE TABLE IF NOT EXISTS domicilios (";
$crear.="DNI CHAR(8) NOT NULL, ";
$crear.="calle VARCHAR (20), ";
$crear.="poblacion VARCHAR (20), ";
$crear.="distrito VARCHAR(5), ";
$crear.=" UNIQUE identidad (DNI), ";
$crear.="FOREIGN KEY (DNI) REFERENCES alumnos(DNI) ";
$crear.="ON DELETE CASCADE ";
$crear.="ON UPDATE CASCADE ";
$crear.=") TYPE = INNODB";
if(mysql_query ($crear ,$c)){
	print "tabla   <b>domicilios</b> creada<br>";
}else{
    print "ha habido un error al crear la tabla <b>domicilios</b><BR>";
}
###############################################
# Creación de la tabla nombres con indice primario EVALUACIONES
# tabla de nombres con índice primario en NUMERO
###############################################
$crear="CREATE TABLE IF NOT EXISTS evaluaciones (";
$crear.="NUMERO CHAR(1) NOT NULL,  ";
$crear.="nombre_evaluacion VARCHAR (20)  NOT NULL, ";
$crear.=" PRIMARY KEY(NUMERO)";
$crear.=")";
$crear.=" Type=InnoDB";
if(mysql_query ($crear ,$c)){
	print "tabla <b>evaluaciones</b> creada<BR>";
}else{
    print "ha habido un error al crear la tabla <b>evaluaciones</b><BR>";
}
###############################################
# Creación de la tabla notas
# indice UNICO para los campos DNI y evaluacion
# con ello se impide calificar dos veces al mismo
# alumno en la misma evaluacion
# claves foráneas (DOS)
# el DNI de nombres para evitar calificar a alumnos inexistentes
# el NUMERO de la tabla evaluaciones para evitar calificar
# DOS VECES en una evaluación a un alumno
###############################################
$crear="CREATE TABLE IF NOT EXISTS notas (";
$crear.="DNI CHAR(8) NOT NULL, ";
$crear.="evaluacion CHAR (1) NOT NULL, ";
$crear.="calificacion TINYINT (2), ";
/* observa que este indice primario está formado
   por dos campos (DNI y evalucion) y que, como siempre
   en el caso de PRIMARY KEY ambos son de tipo NOT NULL */
$crear.=" PRIMARY KEY  vemaos(DNI,evaluacion), ";
/* Fijate en la secuencia siguiente:
  1º.- Creamos el índice
  2º.- Establecemos la clave foránea
  3º.- Establecemo las condiciones ON DELETE
  4º.- Establecemos las condiciones ON UPDTE
  Es muy importe mantener esta secuencia para evitar
  errores MySQL */
$crear.=" INDEX identico (DNI), ";
$crear.="FOREIGN KEY (DNI) REFERENCES alumnos(DNI) ";
$crear.="ON DELETE CASCADE ";
$crear.="ON UPDATE CASCADE,";
/* Esta tabla tiene dos claves foráneas asociadas a dos tablas
   la anterior definida sobre alumnos como tabla principal
   y esta que incluimos a continuación asociada con evaluaciones
   Como ves repetimos la secuencia descrita anteriormente
   Es importante establecer estas definiciones de una en una
   (tal como ves en este ejemplo) y seguir la secuencia
   comentada anteriormente  */
$crear.=" INDEX evalua (evaluacion),";
$crear.="FOREIGN KEY (evaluacion) REFERENCES evaluaciones(NUMERO) ";
$crear.="ON DELETE CASCADE ";
$crear.="ON UPDATE CASCADE";
$crear.=") TYPE = INNODB";
if(mysql_query ($crear ,$c)){
	print "tabla <b>notas</b> creada <BR>";
}else{
    print "ha habido un error al crear la tabla <b>notas</b><BR>";
	echo mysql_error ($c)."<br>";
    echo mysql_errno ($c);
}

mysql_close();
?>

  ¡Cuidado!  

Como puedes observar en la imagen, al definir la estructura de las tablas es muy importante prestar atención a que los campos vinculados sean del mismo tipo y dimensión.

Observa también que los campos de referencia de los vínculos que se establecen (en las tablas primarias) tienen que ser definidos como PRIMARY KEY y que, por tanto, han de establecerse como no nulos (NOT NULL).

Importación y exportación de datos

Es esta una opción interesante por la posibilidad que ofrece de intercambiar datos entre diferentes fuentes y aplicaciones.

Importación de ficheros

MySQL permite insertar en sus tablas los contenidos de ficheros de texto. Para ello utiliza la sentencia que tienes al margen y que detallaremos a continuación.

Inserción de datos en tablas

    MySQL permite importar ficheros externos utilizando la siguiente sintaxis:

    LOAD DATA INFILE "nombre del fichero' [REPLACE | IGNORE]
    INTO TABLE
nombre de la tabla
     FIELDS
        TERMINATED BY '
indicador de final de campo'
        ENCLOSED BY '
caracteres delimitadores de campos'
    LINES
        STARTING BY '
caracteres indicadores de comienzo de registro'
        TERMINATED BY '
caracteres indicadores del final de registro'

    En este ejemplo puedes ver un caso práctico de inserción de datos en las tablas creadas anteriormente.
<?php
$base="ejemplos";
$c=mysql_connect ("localhost","pepe","pepa");
mysql_select_db ($base, $c);
/* evitamos los conflictos de los saltos de linea segun el sistema operativo */
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
    $salto_linea="'\r\n'";
      }else{
    $salto_linea="'\n'";
}
/* hemos creado un fichero de texto (datos_alumnos.txt)
 que contiene datos de algunos alumnos. Los diferentes
 campos están entre comillas y separados unos de otros
 mediante un punto y coma.
 Cada uno de los registros comienza por un asterios
 y los registros están separados por un salto de línea (\r\n) en Windows
 o (\n) en Linux. Por esa razón de compatibilidad de sistemas
 hemos incluido estos valores en una variable $Salto_linea cuyo contenido
 difiere sengun sistema operativo que esté ejecutando este script
 Incluimos estás especificaciones en la sentencia de inserción */
$query="LOAD DATA INFILE ";
$query.="'".$_SERVER['DOCUMENT_ROOT'].'/php/datos_alumnos.txt'."'";
$query.= " REPLACE INTO TABLE alumnos";
$query.= " FIELDS ENCLOSED BY '\"' TERMINATED BY ';' ";
$query.=" LINES STARTING BY '*' TERMINATED BY $salto_linea ";
if(mysql_query($query,$c)){
   print "Datos de alumnos cargados<br>";
			 }else{
   print mysql_error ($c)."<br>".mysql_errno ($c);
}
/*  Para esta tabla usaremos el fichero datos_evaluaciones.txt
Los diferentes campos están entre comillas y separados unos de otros
 mediante una coma. Cada uno de los registros comienza por un espacio
 y los registros están separados por un salto de línea (\r\n) en Windows
 o (\n) en Linux. Por esa razón de compatibilidad de sistemas
 hemos incluido estos valores en una variable $Salto_linea cuyo contenido
 difiere sengun sistema operativo que esté ejecutando este script
 Incluimos estás especificaciones en la sentencia de inserción */
$query="LOAD DATA INFILE ";
$query.="'".$_SERVER['DOCUMENT_ROOT'].'/php/datos_evaluaciones.txt'."'";
$query.= " REPLACE INTO TABLE evaluaciones";
$query.= " FIELDS ENCLOSED BY '\'' TERMINATED BY ',' ";
$query.=" LINES STARTING BY ' ' TERMINATED BY $salto_linea ";
 if(mysql_query($query,$c)){
   print "Datos de evaluaciones cargados<br>";
			 }else{
   print mysql_error ($c)."<br>".mysql_errno ($c);
}
/* En este caso no incluimos especificación alguna.
   Bajo este suspuesto MySQL interpreta los valores por defecto
   que son: los campos no van encerrados, las líneas no tienen
   ningún carácter indicador de comienzo, los campos están separados
   mediante tabulaciones (carácter de escape \t) y el final de línea
   está señalado por un caracter de nueva línea (\n) */
$query="LOAD DATA INFILE ";
$query.="'".$_SERVER['DOCUMENT_ROOT'].'/php/datos_notas.txt'."'";
$query.= " IGNORE INTO TABLE notas";
if(mysql_query($query,$c)){
   print "Datos de notas cargados<br>";
			 }else{
  print mysql_error ($c)."<br>".mysql_errno ($c);
}
/* Se comporta como los casos anteriores con distincos caracteres
   para los diferentes eventos, tal como puedes ver en el código */
$query="LOAD DATA INFILE ";
 $query.="'".$_SERVER['DOCUMENT_ROOT'].'/php/datos_domicilios.txt'."'";
 $query.= " IGNORE INTO TABLE domicilios";
 $query.= " FIELDS ENCLOSED BY '|' TERMINATED BY '*' ";
 $query.=" LINES STARTING BY '#' TERMINATED BY '}' ";
if(mysql_query($query,$c)){
   print "Datos de domicilios cargados
"; }else{ print mysql_error ($c)."<br>".mysql_errno ($c); } mysql_close();
?>
Consultar tablas
  ¡Cuidado!  

Al importar ficheros habrá de utilizarse el mismo formato con el que fueron creados tanto FIELDS como LINES.

Exportación de ficheros

Se comporta de forma similar al supuesto anterior. Utiliza la sintaxis siguiente:

SELECT * INTO OUTFILE
Inicia la consulta de los campos especificados después de SELECT (si se indica * realiza la consulta sobre todos los campos y por el orden en el que fue creada la tabla) y redirige la salida a un fichero.

nombre del fichero
Es la ruta, nombre y extensión del fichero en el que serán almacenados los resultados de la consulta.

FIELDS
    ENCLOSED BY
    TERMINATED BY
LINES
    STARTING BY
    TERMINATED BY

Igual que ocurría en el caso de importación de datos, estos parámetros son opcionales. Si no se especifican se incluirán los valores por defecto.

FROM nombre
Su inclusión tiene carácter obligatorio. El valor de nombre ha de ser el de la tabla sobre la que se realiza la consulta.

Guardar datos en ficheros

    MySQL permite los contenidos de sus tablas a ficheros de texto. Para ello utiliza la siguiente sintaxis:

    SELECT * INTO OUTFILE "nombre del fichero'
     FIELDS
        TERMINATED BY '
indicador de final de campo'
        ENCLOSED BY '
caracteres delimitadores de campos'
    LINES
        STARTING BY '
caracteres indicadores de comienzo de registro'
        TERMINATED BY '
caracteres indicadores del final de registro'
    FROM nombre de la tabla
<?php
$base="ejemplos";
$c=mysql_connect ("localhost","pepe","pepa");
mysql_select_db ($base, $c);
$query="SELECT * INTO OUTFILE ";
$query.="'".$_SERVER['DOCUMENT_ROOT'].'/php/alumnos.txt'."'";
$query.= " FIELDS ENCLOSED BY '\"' TERMINATED BY ';' ";
$query.=" LINES STARTING BY '*' TERMINATED BY '\r\n' ";
$query.=" FROM alumnos";
if(mysql_query($query,$c)){
    print "fichero  alumnos.txt creado<br>";
}else{
    print mysql_error ($c)."<br>". mysql_errno ($c);
}
$query="SELECT * INTO OUTFILE ";
$query.="'".$_SERVER['DOCUMENT_ROOT'].'/php/domicilios.txt'."'";
$query.= " FIELDS ENCLOSED BY '|' TERMINATED BY '*;' ";
$query.=" LINES STARTING BY '#' TERMINATED BY '}' ";
$query.=" FROM domicilios";
if(mysql_query ($query,$c)){
    print "fichero domicilios.txt creado<br>";
}else{
    print mysql_error ($c)."<br>".mysql_errno ($c);
}
$query="SELECT * INTO OUTFILE ";
$query.="'".$_SERVER['DOCUMENT_ROOT'].'/php/notas.txt'."'";
$query.=" FROM notas";
if(mysql_query ($query,$c)){
    print "fichero notas.txt creado<br>";
}else{
    print mysql_error ($c)."<br>".mysql_errno ($c);
}
$query="SELECT * INTO OUTFILE ";
$query.="'".$_SERVER['DOCUMENT_ROOT'].'/php/evaluaciones.txt'."'";
$query.= " FIELDS ENCLOSED BY '\'' TERMINATED BY ',' ";
$query.=" LINES STARTING BY ' ' TERMINATED BY '\r\n' ";
$query.=" FROM evaluaciones";
if(mysql_query ($query,$c)){
    print "fichero evaluaciones.txt creado<br>";
}else{
    print mysql_error ($c)."<r>".mysql_errno ($c);
}
mysql_close();
?>
  ¡Cuidado!  

Al exportar ficheros en entornos Windows, si se pretende que en el fichero de texto aparezca un salto de línea no basta con utilizar la opción por defecto de LINES TERMINATED BY '\n' sino LINES TERMINATED BY '\r\n' (salto de línea y retorno) que son los caracteres que necesita Windows para producir ese efecto.
Habrá de seguirse este mismo criterio cuando se trata de importar datos desde un fichero de texto.