Professional Documents
Culture Documents
Definición de tablas
Estructura de tablas y relaciones
Para desarrollar los ejemplos de este capítulo vamos a crear las tablas, cuyas estructuras
En este ejemplo de tablas e interrelaciones que puedes ver en el código fuente siguiente:
vinculadas con integridad
relacional vamos a proponer la
situación siguiente. <?
$base="ejemplos";
Crearemos una primera tabla $c=mysql_connect ("localhost","pepe","pepa");
(alumnos) que va a contener mysql_select_db ($base, $c);
datos personales de un grupo de ###############################################
personas. # Creación de la tabla nombres con indice primario DNI
Para evitar duplicar un mismo
# tabla de nombres con índice primario en DNI
alumno y alumnos sin DNI, vamos ###############################################
a utilizar como índice primario $crear="CREATE TABLE IF NOT EXISTS alumnos (";
(PRIMARY KEY) el campo DNI (que $crear.="DNI CHAR(8) NOT NULL, ";
es único para cada persona). $crear.="Nombre VARCHAR (20) NOT NULL, ";
$crear.="Apellido1 VARCHAR (15) not null, ";
La condición de que el campo DNI $crear.="Apellido2 VARCHAR (15) not null, ";
sea PRIMARY KEY nos obliga a $crear.=" PRIMARY KEY(DNI) ";
definirlo con el flag NOT NULL,
$crear.=")";
dado que esta es una condición
necesaria para la definición de
$crear.=" Type=InnoDB";
índices primarios. if(mysql_query ($crear ,$c)){
print "tabla <b>nombres</b> creada<BR>";
Crearemos una segunda tabla }else{
(domicilios) con los domicilios de print "ha habido un error al crear la tabla <b>alumnos</b><BR>";
cada uno de los alumnos, }
identificándolos también por su ###############################################
DNI. Para evitar que un mismo # Creación de la tabla direcciones
alumno pueda tener dos domicilios
# tabla de nombres con índice único en DNI
asignamos a al campo DNI de esta
# para evitar dos direcciones al mismo alumno
tabla la condición de índice único
(UNIQUE). # y clave foránea nombres(DNI)
# para evitar direcciones no asociadas a un alumno
El índice UNIQUE podríamos # concreto. Se activa la opción de actualizar
haberlo creado también como # en cascada y de borrar en cascada
PRIMARY KEY ya que la única ###############################################
diferencia de comportamiento $crear="CREATE TABLE IF NOT EXISTS domicilios (";
entre ambos es el hecho que aquel $crear.="DNI CHAR(8) NOT NULL, ";
admitiría valores NULOS pero,
$crear.="calle VARCHAR (20), ";
dado que debemos evitar
$crear.="poblacion VARCHAR (20), ";
domicilios sin alumnos,
insertaremos el flag NOT NULL en $crear.="distrito VARCHAR(5), ";
este campo. $crear.=" UNIQUE identidad (DNI), ";
$crear.="FOREIGN KEY (DNI) REFERENCES alumnos(DNI) ";
El hecho de utilizar dos tablas no $crear.="ON DELETE CASCADE ";
tiene otro sentido que la $crear.="ON UPDATE CASCADE ";
ejemplificación ya que lo habitual $crear.=") TYPE = INNODB";
sería que todos los datos if(mysql_query ($crear ,$c)){
estuvieran en una misma tabla.
print "tabla <b>domicilios</b> creada<br>";
Vincularemos ambas tablas de }else{
modo que no puedan crearse print "ha habido un error al crear la tabla <b>domicilios</b><BR>";
direcciones de alumnos }
inexistentes y les pondremos la ###############################################
opción de actualización y borrado # Creación de la tabla nombres con indice primario EVALUACIONES
en cascada. De esta forma las # tabla de nombres con índice primario en NUMERO
acciones en la tabla de alumno se ###############################################
reflejarían automáticamente en la $crear="CREATE TABLE IF NOT EXISTS evaluaciones (";
tabla de domicilios. $crear.="NUMERO CHAR(1) NOT NULL, ";
La tercera de las tablas $crear.="nombre_evaluacion VARCHAR (20) NOT NULL, ";
(evaluaciones) tiene como $crear.=" PRIMARY KEY(NUMERO)";
finalidad definir las distintas $crear.=")";
evaluaciones que puede realizarse $crear.=" Type=InnoDB";
a cada alumno. Tendrá dos if(mysql_query ($crear ,$c)){
campos. Uno descriptivo (el print "tabla <b>evaluaciones</b> creada<BR>";
nombre de la evaluación) y otro }else{
identificativo (no nulo y único) que print "ha habido un error al crear la tabla <b>evaluaciones</b><BR>";
será tratado como PRIMARY KEY }
para evitar duplicidades y porque,
###############################################
además, va a ser utilizado como
clave foránea en la tabla notas.
# Creación de la tabla notas
# indice UNICO para los campos DNI y evaluacion
La tabla notas va a tener tres # con ello se impide calificar dos veces al mismo
campos: DNI, nº de evaluación y # alumno en la misma evaluacion
calificación. # claves foráneas (DOS)
# el DNI de nombres para evitar calificar a alumnos inexistentes
Estableceremos restricciones para
# el NUMERO de la tabla evaluaciones para evitar calificar
evitar que:
# DOS VECES en una evaluación a un alumno
###############################################
● Podamos calificar a un $crear="CREATE TABLE IF NOT EXISTS notas (";
alumno inexistente. $crear.="DNI CHAR(8) NOT NULL, ";
● Podamos calificar una
$crear.="evaluacion CHAR (1) NOT NULL, ";
evaluación no incluida entre
las previstas.
$crear.="calificacion TINYINT (2), ";
● Podamos poner más a cada /* observa que este indice primario está formado
alumnos más de una por dos campos (DNI y evalucion) y que, como siempre
calificación por evaluación. en el caso de PRIMARY KEY ambos son de tipo NOT NULL */
$crear.=" PRIMARY KEY vemaos(DNI,evaluacion), ";
Creando una índice primario
/* Fijate en la secuencia siguiente:
formado por los campos DNI y 1º.- Creamos el índice
evaluación evitaremos la última de 2º.- Establecemos la clave foránea
3º.- Establecemo las condiciones ON DELETE
las situaciones y añadiendo una 4º.- Establecemos las condiciones ON UPDTE
vinculación con las tablas alumnos
Es muy importe mantener esta secuencia para evitar
y evaluaciones estaremos en
condiciones de evitar las dos
errores MySQL */
primeras. $crear.=" INDEX identico (DNI), ";
$crear.="FOREIGN KEY (DNI) REFERENCES alumnos(DNI) ";
En este gráfico puedes ver un $crear.="ON DELETE CASCADE ";
esquema de la definición de estas $crear.="ON UPDATE CASCADE,";
tablas. /* 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();
?>
Crear tablas
ejemplo
¡Cuidado!
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).
El uso de esta opción no requiere SELECT * INTO OUTFILE "nombre del fichero'
que se especifique previamente FIELDS
ENCLOSED BY pero si necesita
que se haya incluido FIELDS.
TERMINATED BY 'indicador de final de campo'
LINES ENCLOSED BY 'caracteres delimitadores de campos'
Si el fichero de datos contiene LINES
caracteres (distintos de los valores STARTING BY 'caracteres indicadores de comienzo de registro'
por defecto) para señalar el TERMINATED BY 'caracteres indicadores del final de registro'
comienzo de un registro, el final
FROM nombre de la tabla
del mismo o ambos, debe incluirse
este parámetro y, después de él,
las especificaciones de esos <?
valores correspondientes a: $base="ejemplos";
$c=mysql_connect ("localhost","pepe","pepa");
STARTING BY
mysql_select_db ($base, $c);
Permite especificar una carácter
if(mysql_query ("SELECT * INTO OUTFILE
como indicador de comienzo de un
registro. Si se omite o se 'c:/Apache/htdocs/cursoPHP/alumnos.txt'
especifica como '' se interpretará FIELDS ENCLOSED BY '\"' TERMINATED BY ';'
que no hay ningún carácter que LINES STARTING BY '*' TERMINATED BY '\r\n'
señale en comienzo de línea. FROM alumnos",$c)){
print "fichero alumnos.txt creado<br>";
TERMINATED BY }else{
Es el indicador del final de un echo mysql_error ($c)."<br>";
registro. Si se omite será echo mysql_errno ($c);
considerado como un salto de línea
}
(\n).
if(mysql_query ("SELECT * INTO OUTFILE
'c:/Apache/htdocs/cursoPHP/domicilios.txt'
Exportación de ficheros FIELDS ENCLOSED BY '|' TERMINATED BY '*'
LINES STARTING BY '#' TERMINATED BY '}'
Se comporta de forma similar al FROM domicilios",$c)){
supuesto anterior. Utiliza la print "fichero domicilios.txt creado<br>";
sintaxis siguiente: }else{
echo mysql_error ($c)."<br>";
SELECT * INTO OUTFILE
echo mysql_errno ($c);
Inicia la consulta de los campos
}
especificados después de SELECT
(si se indica * realiza la consulta if(mysql_query ("SELECT * INTO OUTFILE
sobre todos los campos y por el 'c:/Apache/htdocs/cursoPHP/notas.txt'
orden en el que fue creada la FROM notas",$c)){
tabla) y redirige la salida a un print "fichero notas.txt creado<br>";
fichero. }else{
echo mysql_error ($c)."<br>";
nombre del fichero echo mysql_errno ($c);
Es la ruta, nombre y extensión del }
fichero en el que serán
if(mysql_query ("SELECT * INTO OUTFILE
almacenados los resultados de la
consulta. 'c:/Apache/htdocs/cursoPHP/evaluaciones.txt'
FIELDS ENCLOSED BY '\'' TERMINATED BY ','
FIELDS
LINES STARTING BY ' ' TERMINATED BY '\r\n'
ENCLOSED BY FROM evaluaciones",$c)){
TERMINATED BY
print "fichero evaluaciones.txt creado<br>";
LINES
}else{
STARTING BY
TERMINATED BY echo mysql_error ($c)."<br>";
Igual que ocurría en el caso de echo mysql_errno ($c);
importación de datos, estos }
parámetros son opcionales. Si no mysql_close();
se especifican se incluirán los ?>
valores por defecto.
Ejecutar script