Indice Unico en MySQL


Si has diseñado esquemas relacionales de bases de datos para tus aplicaciones, ya sean Web o Desktop entonces sabes el significado de los índices únicos. Para los que quizás utilicen nuestro sitio como punto de partida en sus experiencias como desarrollador pues les voy a explicar con un breve ejemplo de la vida real la utilidad de los índices únicos. Digamos una tabla de personas con los siguientes datos: nombre, apellidos, DNI y otros como teléfono, dirección, etc.

A simple vista nos damos cuenta que hay ciertos datos que nunca deben repetirse ya sean solos o combinados. Por ejemplo DNI, el número de identificación de cada persona no importa el país donde hayan nacido, lo mismo que el número de pasaporte. Nombre y apellidos combinados dependiendo del alcance del software es posible que tampoco deba repetirse. La idea es crear un tipo de índice que agrupe a estos campos y asegure cero duplicidad en los elementos de la tabla. 2 personas como el mismo número de identificación, 2 personas con la misma combinación de nombre y apellidos en el ejemplo que estamos ilustrando.

En MySQL este tipo de índice se llama UNIQUE. Se pueden crear cualquier número de índices únicos en una tabla MySQL relacionando tantos campos como sean necesarios. Digamos que vamos a crear la tabla persona con los campos antes expuestos, la sentencia SQL quedaría de la siguiente forma:

  CREATE TABLE `persona` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `nombre` varchar(25) NOT NULL,
    `apellidos` varchar(45) NOT NULL,
    `dni` VARCHAR(15) NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `dni` (`dni`)
  ) ENGINE=InnoDB DEFAULT CHARSET=latin1

Como ven hemos establecido que el campo dni sea único. ¿Cuáles son las consecuencias de esto? Pues que no podrán existir en la tabla persona 2 elementos con el mismo número de identificación, lo cual lanzará un error si esto sucediera tras una operación INSERT o UPDATE resultando la no ejecución de la misma.

Ahora, el sistema es una aplicación de recursos humanos en nuestra empresa y aunque es posible que existan empleados con el mismo nombre (muy probable), es bastante improbable que la dupla nombre y apellidos se repita por lo que no debe existir ningún elemento duplicado. Ya la tabla está creada con una llave primaria y una única en el campo dni, y procedemos a crear una tercera (única) con la dupla nombre y apellidos.

  ALTER TABLE `persona`
  ADD UNIQUE INDEX `ix_persona` (`nombre`, `apellidos`);

Procedemos a insertar elementos duplicados en la tabla persona. Ejecutaremos la misma consulta SQL dos veces, mismo nombre y apellidos. Veremos que nos devuelve.

  INSERT INTO  `mysql`.`persona` (`id` ,`nombre` ,`apellidos` ,`dni`)
  VALUES (NULL ,  'Leroy',  'Ley',  '123456')

El campo id se autocompleta por lo cual es NULL en la consulta, MySQL lo autoincrementará en cada inserción. La primera vez que ejecutamos la consulta el primer elemento es creado, luego al repetirla MySQL devuelve un error como el siguiente:

#1062 – Duplicate entry ‘Leroy-Ley’ for key ‘ix_persona’

Como ven previene la creación de elementos duplicados según los índices únicos. Ahora nuevamente trataremos de insertar una nueva persona, esta vez el nombre y los apellidos serán diferentes pero el dni coincidirá.

  INSERT INTO  `mysql`.`persona` (`id` ,`nombre` ,`apellidos` ,`dni`)
  VALUES (NULL ,  'Alejandro',  'Perez',  '123456')

Como ya adivinan el error devuelto es el siguiente:

#1062 – Duplicate entry ‘8388607’ for key ‘dni’

En casi todos los gestores de Base de Datos el índice único existe, solo cambia la manera de implementación. El uso de este índice es variado y casi obligatorio en un buen diseño de base de datos. Prueben a insertar personas como en los ejemplos anteriores y verán el resultado. Los valores para el índice único no pueden repetirse y eso es una regla de oro.

Latest posts by Leroy Ley (see all)