Ver índice
Creación de tablas usando MySQLi

        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


Tipos de tablas

La mayoría de los contenidos de esta página son pura transcripción del contenido de esta otra. Hay algunas diferencias de tratamiento que señalaremos para facilitarte la opción de comparación de los diferentes interfaces

MySQL permite usar diferentes tipos de tablas tales como: ISAM, MyISAM o InnoDB.

Las tablas ISAM (Indexed Sequential Access Method) son las de formato más antiguo. Están limitadas a tamaños que no superen los 4 gigas y no permite copiar tablas entre máquinas con distinto sistema operativo.

Las tablas MyISAM son el resultado de la evolución de las anteriores adaptadas por MySQL durante mucho tiempo como el formato por defecto para sus servidores de bases de datos. En las versiones más recientes de MySQL está cambiando es criterio y empiezan a verse versiones que incluyen InnoDB como formato por defecto.

Las tablas del tipo InnoDB (desarrolladas por la compañía finlandesa InnoBase a la que deben su nombre) tienen una estructura distinta a la de MyISAM, ya que utilizan un sólo archivo por tabla en ver de los tres habituales en los tipos anteriores. Incorporan dos de ventajas muy importantes: permiten realizar transacciones y definir reglas de integridad referencial. Hablaremos más adelante de ello.

La definición de uno u otro formato (MyISAM o InnoDB) debe hacerse en el momento de la creación de tabla y solo reguiere agregar Type=MyISAM ó Type=InnoDB a la sentencia MySQL encargada de crearla.

Creación de tablas

Las tablas son elementos de las base de datos. Por esa razón nos resultará imposible crear una tabla sin tener creada y seleccionada una base de datos. Es por eso que para la creación de una tabla se necesitan los siguientes requisitos:

Conexión con el servidor

La hemos comentado en la página anterior. Recuerda que requería la función: $conexion = mysqli_connect ( servidor, usuario, contraseña ) (no confundir el mysqli_connect utilizado aquí con mysql_connect que es el manejado en páginas anteriores)y que esa conexión ha de ser establecida antes de cualquier otra intervención relacionada con accesos a bases de datos y tablas.

Selección de la base de datos

Dado que podemos manejar bases de datos distintas es preciso decir a MySQL con qué base queremos trabajar.

mysqli_select_db(nombre_base_datos, $conexion)

donde nombre_base_datos es el nombre de la base de datos (puede ser una cadena entrecomillada o el nombre de una variable previa que contenga ese nombre). En este último caso, como es habitual, el nombre de la variable no llevaría comillas. El segundo parámetro $conexion es el identificador de conexión. Es decir, la variable creada al establecer la conexión con MySQL. Este valor debe insertarse siempre. La razón es que MySQL permite mantener abiertas varias, de forma simultánea, varias conexiones (podríamos manejar más de un servidor de bases de datos) y en esas condiciones no pueden darse ambigüedades respecto a la base que pretendemos usar.

También es conveniente tener muy presente que en este caso hay que diferenciar también mysqli_select_db de mysql_select_db (observa que se diferencian únicamente en una «i»).

Este proceso puede simplicarse incluyendo el nombre de la base de datos como cuarto parámetro de la función mysqli_connect. Mediante esta opción

$conexion = mysqli_connect ( servidor, usuario, contraseña, nombre_base_datos)

estaremos seleccionando la base de datos nombre_base_datos a la vez que establecemos la conexión. Si hemos optado por la programación orientada a objetos la selección de la base de datos puede incluirse en la llamada al constructor de la clase. La forma de hacerlo es similar a esta:

$objeto = new mysqli ( servidor, usuario, contraseña, nombre_base_datos)

Creación de una tabla

En todas las transacciones PHP – MySQL habremos de utilizar instrucciones de ambos lenguajes. La forma habitual –hay algunas excepciones– en la que PHP se comunica con MySQL. Para utilizar el interface mysqli es necesario utilizar la función genérica:

mysqli_query($conexion, $sentencia );

donde la variable $sentencia contiene las instrucciones propias de MySQL y $conexion sigue siendo la variable que contiene el identificador de conexión.

En el ámbito de la programación orientada a objetos la ejecución de este tipo de sentencias (una vez creado el objeto y establecida satisfactoriamente la conexión) utiliza siempre la misma sintaxis:

$objeto->query( $sentencia)

Las variables aludidas como $sentencia en los párrafos anteriores ha de contener una de estas cadenas:

CREATE TABLE IF NOT EXISTS tabla (campo1, campo2,... ) Type=tipo
o
CREATE TABLE tabla (campo1, campo2,... )) Type=tipo

donde tabla es una cadena que contiene el nombre de la tabla que pretendemos crear, dónde campo1, campo2, etc. son las definiciones de los campos que pretendemos que contenga la tabla y tipo puede ser MyISAM o InnoDB según el tipo de tabla que queramos crear.

La única diferencia entre ambas opciones es que la segunda daría un error si tratáramos de crear una tabla preexistente (deberíamos recurrir al procedimiento que hemos visto cuando creábamos bases de datos) mientras que la primera no da ese mensaje de error.

Definición de campos en una tabla MySQL

Cada uno de los campos que vayamos a crear en una tabla requiere una definición que debe contener lo siguiente:

– nombre del campo

Es una palabra cualquiera –distinta para campo de la tabla y que normalmente suele elegirse aludiendo al contenido. Por ejemplo, fecha_nacimiento, nombre_del_perro, etcétera. No va entre comillas nunca y MySQL diferencia mayúsculas/minúsculas.

Para utilizar como nombres de campo palabras reservadas del lenguaje MySQL –por ejemplo, create– debemos escribirlas entre ` `. Observa que no son comillas sino acentos graves. Lo más aconsejable es evitar esta situación.

– tipo y dimensiones

Los tipos de campos –los hemos visto en la página anterior– tienen que ajustarse a uno de los soportados por MYSQL. El tipo de campo se escribe a continuación del nombre sin otra separación que un espacio y requieren la sintaxis –estricta– correspondiente a cada tipo.

Cuando se establezca una dimensión como parámetro opcional de un campo deben tenerse en cuenta algunos detalles:


– flags del campo ( son opcionales)

Puede utilizarse cualquiera de los permitidos para cada tipo de campo. Puedes verlos encerrados, entre corchetes, al lado de cada tipo de campo. Cuando sea necesario incluirlo han de escribirse inmediatamente después del nombre del campo o de la dimesión (en los casos en que se incluya).

Ejemplo de creación de una tabla

Este ejemplo con campos idénticos a los de uno incluido en páginas anteriores podemos ver las dos opciones de creación de tablas en una base de datos. Dependiendo del valor pasado como tipo en la llamada al script se ejecutará una u otra de las opciones.

<?php
/* crearemos antes una variable que recoja toda la sentencia
y será luego cuando la ejecutemos
Definiremos una varable llamada $crear e iremos añadiendo cosas */
# la primera parte de la instrucción es esta (espacio final incluido
$crear="CREATE TABLE IF NOT EXISTS ";
# añadiremos el nombre de la tabla que será ejemplo1
# fijate en el punto (concatenador de cadenas) que permite
# ir añadiendo a la cadena anterior
$crear .="ejemplo1 ";
#ahora pongamos el paréntesis (con un espacio delante)
#aunque el espacio también podría detrás de ejemplo1
$crear .="( ";
# insertemos el primer campo y llamemoslo num1
# hagamoslo de tipo TINYINT sin otras especificamos
# sabiendo que solo permitira valores numéricos
# comprendidos entre -128 y 127
$crear .="num1 TINYINT , ";
# LOS CAMPOS SE SEPARAN CON COMAS por eso
# la hemos incluido al final de la instrucción anterior

# ahora num2 del mismo tipo con dimensión 3 y el flag UNSIGNED
# Y ZEROFILL que: cambiará los límites de valores
# al intervalo 0 - 255, y rellenará con ceros por la izquierda
# en el caso de que el número de cifras significativas
# sea menor de 3.
# Fijate que los flags van separado unicamente por espacios
$crear .="num2 TINYINT (3) UNSIGNED ZEROFILL,  ";
# en num3 identico al anterior añadiremos un valor por defecto
# de manera que cuando se añadan registros a la tabla
# se escriba automaticamente ese valor 13 en el caso
# de que no le asignemos ninguno a ese campo
# por ser numérico 13 no va entre comillas
$crear .="num3 TINYINT (7) UNSIGNED ZEROFILL DEFAULT 13,  ";
# ahora un número decimal num4  tipo REAL con 8 digitos en total
# de los cuales tres serán decimales y también rellenaremos con ceros
# Pondremos como valor por defecto 3.14
$crear .="num4 REAL (8,3) ZEROFILL DEFAULT 3.14,  ";
# añadamos una fecha
$crear .="fecha DATE,  ";
/* una cadena con un limite de 32 carácter con BINARY
   para que diferencie  Pepe de PEPE */
$crear .="cadena VARCHAR(32) BINARY,  ";
/*  un ultimo campo –opcion– del tipo ENUM que solo admita
   como valores SI, NO, QUIZA
   fijate en las comillas y en el parentesis
 ¡¡cuidado...!! aqui no ponemos coma al final
 es el último campo que vamos a insertar y no necesita
 ser separado. Si la pones dará un ERROR */
$crear .="opcion ENUM('Si','No','Quiza')  ";
# solo nos falta añadir el paréntesis conteniendo toda la instrucción
$crear .=")Type=MyISAM";
/* tenemos completa la sentencia MYSQL  solo falta ejecutarla crear la conexión y ejecutarla */

/*incluimos los parámetros de conexión */
include('mysqli.inc.php');
/* incluimos dos opciones de proceso y de programacion orientada a objetos. Podemos ejecutar
los ejemplos pasado mediante el metodo GET el tipo elegido.  */
if(!empty ($_GET['tipo'])){
    $tipo_script=$_GET['tipo'];
}else{
    $tipo_script="objetos";
}


/*En caso de tipo proceso utilizaríamos esto */

if ($tipo_script=="proceso"){
    /******    Programación mediante procesos ***********/
    #conexion, selección de tabla y verificacion de errores segun ejemplos anteriores
    $conexion=@mysqli_connect ($cfg_servidor,$cfg_usuario,$cfg_password,$cfg_basephp1);
    if(!mysqli_connect_errno()==0){
        print "<br>No ha podido realizarse la conexión mediante procesos<br>";
        print "Error número: ". mysqli_connect_errno()." equivalente a: ". mysqli_connect_error();
        exit();
    }
    # gestion de la base de datos. Los parámetros requieren el ordn aquí indicado

    if(mysqli_query($conexion,$crear)){
            print "La tabla ha sido CREADA";
    }else{
   	        print "<br>No ha podido crearse la base de datos mediante procesos<br>";
            print "Error : ". mysqli_error($conexion);
            exit();
    }
    mysqli_close($conexion);

}
/* en caso de programacion orientada a objetos */
if ($tipo_script=="objetos"){
    /******    Programación mediante objetos ***********/
    #conexion, selección de tabla y verificacion de errores segun ejemplos anteriores
    $objeto=@new mysqli ($cfg_servidor,$cfg_usuario,$cfg_password,$cfg_basephp1);
    if(!$objeto->connect_errno==0){
        print "<br>No ha podido realizarse la conexión mediante objetos<br>";
        print "Error número: ". $objeto->connect_errno." equivalente a: ". $objeto->connect_error;
        exit();
    }
    # gestion de la base de datos. Los parámetros requieren el ordn aquí indicado

    if($objeto->query($crear)){
            print "La tabla ha sido CREADA";
    }else{
   	        print "<br>No ha podido crearse la tabla mediante objetos<br>";
            print "Error : ". $objeto->error;
            exit();
    }

    $objeto->close();
}

?>
Mediante procesos Mediante objetos