Ver índice
Añadir registros e índices

        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


Manejando índices

Es muy frecuente la utilización de índices en las bases de datos. Pero... ¿qué son los índices? ¿para qué sirven?. Si nos planteamos cuál es la utilidad del índice de un libro la respuesta podría ser:

La utilidad de los índices en la bases de datos es bastante similar. Si seguimos con el ejemplo del libro veremos que caben las posibilidades de que tenga:

Algunos libros sólo contienen un indice de contenidos. Sin embargo, es frecuente que también dispongan de otros, tales como: índices analíticos, índices onomásticos, etcétera. Cuando existe un solo índice es obvio que puede decirse de él que es único y cuando existen varios podemos decir que el índice de contenidos es el índice principal y los demás son índices sin más o índices auxiliares.

Coincidirás con nosotros en que en el Índice de contenidos de un libro de texto sólo existe una referencia al Tema XIII en la que puede decir: Tema XIII página 314. También coincidirás en que si en ese índice, además de lo anterior, dijera: Tema XIII página 714 nos encontraríamos en una situación confusa que nos obligaría a preguntarnos: ¿donde está el Tema XIII? ¿En la página 314? ¿En la 714? ¿En ambas?.

Es por eso que las tablas de las bases de datos no admiten nunca valores duplicados ni en los índices únicos ni tampoco en los índices principales. Los índices auxiliares tienen un comportamiento distinto. El índice onomástico de un libro puede hacer referencia a varias páginas y puede tener duplicados. Por ejemplo: en un manual de Word puede existir un índice onomástico en el que se asocie la palabra macros con las páginas 37, 234 y 832 siempre que en esas páginas existan contenidos que aludan a la palabra macro.

Es por eso que las tablas de las bases de datos también admiten duplicados cuando se trata de índices auxiliares.

Sintaxis de la definición de índices MySQL

Tanto al crear una tabla como al modificarla pueden añadirse índices de la misma forma que se pueden insertar campos. La sintaxis (dentro de la sentencia MySQL que crea o modifica una tabla) es la siguiente:

PRIMARY KEY(campo)

donde campo es el nombre del campo que se establece como índice principal de la tabla.

El parámetro campo no va entrecomillado y PRIMARY KEY campo se incluye dentro de la sentencia CREATE como si se tratara de un campo más, delimitado por comas, salvo que estuviera al final de la sentencia CREATE, en cuyo caso se omitiría la coma final. Solo puede definirse un índice primario por tabla y el campo utilizado ha de ser un campo no nulo.

UNIQUE nombre (campo)

Similar a PRIMARY KEY en cuanto a que no admite valores duplicados, pero con dos diferencias importantes. UNIQUE permite la creación de más de un índice de este tipo por tabla y además no requiere que los campos sobre los que se define sean no nulos.

INDEX nombre (campo)

Con esta sintaxis se crea un índice secundario que debe tener un nombre (la posibilidad de que existan varios obliga resolver la posible ambigüedad por medio del nombre) y –como en los casos anteriores– el campo que será utilizado como índice.

INDEX nombre (campo(n))

Es un caso particular del anterior utilizable sólo en el caso de que el campo índice sea tipo CHAR o VARCHAR. Al tratarse de cadenas alfanuméricas, mediante esta opción es posible indexar por sus n primeros caracteres. El valor de n ha de ser menor o igual que 256 dado que el tamaño máximo de un índice está limitado en MySQL a 256 bytes.

Otra limitación de MySQL es el número máximo de índices de una tabla que no puede superar de dieciséis.

Los errores MySQL

PHP dispone de dos funciones que nos permiten detectar si una sentencia MySQL se ha ejecutado correctamente o si se ha producido algún error. Son las siguientes:

mysql_errno($conexion)

Indica el número de error que se ha producido en la transacción MySQL realizada a través del identificador de $conexion. Cuando el número de error es CERO significa que no se ha producido error.

Otros valores bastante usuales son los siguientes:

Error número 1050

Indica que hemos tratado de crear una tabla ya existente.

Error número 1062

Indica que hemos tratado de introducir un valor con clave duplicada. Aparecerá cuando tratemos de introducir un valor ya existente en un campo con índice único o principal.

mysql_error($conexion)

Devuelve la descripción del error. Cuando el número de error es CERO devuelve una cadena vacía. Resulta de muchísima utilidad para depurar scripts.

Añadir registros a una tabla

La sentencia MySQL que permite añadir registros a una tabla es la siguiente:

INSERT tabla (campo1,campo2,..) VALUES (valor1,valor2,..)

Vamos a desarrollar un ejemplo completo de creación de una tabla e inserción de registros utilizando diversos métodos. Para ello seguiremos el siguiente proceso:

Creación de la tabla

Empezaremos creando una tabla a la que llamaremos demo4 y que contendrá los siguientes campos:

El código fuente del fichero que genera esta tabla puedes verlo aquí debajo

Ver código fuente

Añadir un registro

Cuando se añade un registro en una tabla los valores pueden añadirse en la propia sentencia MySQL o ser recogidos de los valores de variables PHP previamente definidas.

En este ejemplo tienes el código fuente del primero de los casos, en el que se añade a la tabla anterior un registro cuyos valores son:

DNI Nombre Apellido1 Apellido2 Nacimiento Sexo Hora Fumador Idiomas
1234 Lupicinio Servidor Servido 1954-11-23 M 16:24:52 NULL 3

Ver código fuente

Presta atención a los siguientes aspectos:

Añadir un registro a partir de datos contenidos en variables

También es posible añadir registros a partir de valores contenidos en variables PHP. Esta opción es, sin ninguna duda, la más utilizada, ya que lo habitual será escribir el contenido a añadir en un form y después -a través del method (POST o GET)- pasar al script de inserción esos valores como variables PHP.

Aquí tienes el código fuente de un ejemplo con la tabla anterior.

Ver código fuente

Quizá te resulten de alguna utilidad estos comentarios:

Variantes de la sentencia INSERT

La sentencia INSERT cuya sintaxis se indica más arriba como:

INSERT tabla (campo1,campo2,..) VALUES (valor1,valor2,..)

permite algunos modificadores opciones tales como:

INSERT [LOW_PRIORITY | DELAYED] [IGNORE] tabla (campo1,campo2,..) VALUES (valor1,valor2,..)

de ellos LOW_PRIORITY y DELAYED son incompatibles por lo que solo cabe uno u otro pero no ambos.

Veamos su utilidad. La inserción de registros y la lectura de una tabla son procesos incompatibles, pero cabe la posibilidad de que se intenten ejecutar simultáneamente. No olvides que estamos en Internet y es perfectamente posible que desde dos ordenadores distintos, dos personas distintas estén accediendo a la misma tabla simultáneamente y que uno de los accesos sea de escritura, es decir: añadir, modificar o borrar campos en la tabla.

¿Quién tiene preferencia de paso? ¿Quien tiene que esperar?. Si la opción LOW_PRIORITY está activada, el proceso de escritura esperará a que terminen los procesos de lectura activos, pero si está activa la opción DELAYED el proceso de lectura se interrumpirá automáticamente para ceder el paso al de escritura.

Respecto a la opción IGNORE tiene utilidad cuando se trata de realizar una secuencia de inserciones. Si no está activa en el momento en el que aparezca una clave duplicada se interrumpirá el proceso de inserción, por el contrario, si estuviera activa el proceso de inserción continuará con los siguientes registros de la secuencia, aunque -como es lógico- seguirán sin insertarse los registros con clave duplicada.

Tablas para pruebas

Aquí tienes comentado un script que permite agregar aleatoriamente y de forma automática registros a la tabla demo4. Dado que en las páginas siguientes trataremos de consultas, va a resultarnos muy cómodo poder rellenarlas de forma automática.

Ver código fuente