2 messages in com.mysql.lists.mysql-esRe: consulta sobre índices
FromSent OnAttachments
Gustavo Pardo28 Apr 2006 11:33 
Gustavo Pardo28 Apr 2006 15:02 
Subject:Re: consulta sobre índices
From:Gustavo Pardo (data@gmail.com)
Date:04/28/2006 03:02:30 PM
List:com.mysql.lists.mysql-es

Gustavo Pardo escribió:

hola amigos, el phpMyAdmin me tira esta advertencia y no entiendo porqué:

Las claves UNICA e ÍNDICE no deben seleccionarse juntas para la columna `id_grupo`

tengo las siguientes tablas:

CREATE TABLE `grupos_usuarios` ( `id` int(10) unsigned NOT NULL auto_increment, `grupo` varchar(100) collate latin1_spanish_ci NOT NULL, `descripcion` text collate latin1_spanish_ci NOT NULL, PRIMARY KEY (`id`), KEY `grupo` (`grupo`(20)) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_spanish_ci

CREATE TABLE `modulos` ( `id` int(10) unsigned NOT NULL auto_increment, `modulo` varchar(255) collate latin1_spanish_ci NOT NULL, PRIMARY KEY (`id`), KEY `modulo` (`modulo`(20)) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_spanish_ci

CREATE TABLE `privilegios` ( `id` int(10) unsigned NOT NULL auto_increment, `id_grupo` int(10) unsigned NOT NULL, `id_modulo` int(10) unsigned NOT NULL, `ver` enum('SI','NO') collate latin1_spanish_ci NOT NULL default 'NO', `editar` enum('SI','NO') collate latin1_spanish_ci NOT NULL default 'NO', `insertar` enum('SI','NO') collate latin1_spanish_ci NOT NULL default 'NO', `eliminar` enum('SI','NO') collate latin1_spanish_ci NOT NULL default 'NO', PRIMARY KEY (`id`), UNIQUE KEY `grp_mod` (`id_grupo`,`id_modulo`), KEY `id_grupo_fk` (`id_grupo`), KEY `id_modulo_fk` (`id_modulo`), CONSTRAINT `privilegios_ibfk_1` FOREIGN KEY (`id_grupo`) REFERENCES `grupos_usuarios` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `privilegios_ibfk_2` FOREIGN KEY (`id_modulo`) REFERENCES `modulos` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_spanish_ci

en síntesis, en la tabla privilegios quiero guardar lo que le permito hacer a un determinado grupo de usuarios en un módulo determinado, por lo que en esta tabla (privilegios) defino una foreign key a grupos_usuarios y otra foreign key a modulos, hasta aquí vamos bien, el error aparece cuando además intento definir un índice UNIQUE sobre los campos id_grupo e id_modulo combinados (ya que esta combinación DEBE ser única), copio nuevamente el error:

Las claves UNICA e ÍNDICE no deben seleccionarse juntas para la columna `id_grupo`

¿realmente está mal definido ese índice UNIQUE? ¿alguna sugerencia? gracias.

la versión de MySQL es 5.0.18

saludos.

bueno, me respondo a mí mismo por si a alguno le sirve :)

UNIQUE KEY `grp_mod` (`id_grupo`,`id_modulo`) sirve para indexar las dos columnas juntas Y TAMBIÉN para id_grupo solamente, por lo tanto, no es necesario KEY `id_grupo_fk` (`id_grupo`)

concluyendo, si se tiene un índice así: KEY `index_name` (`col1`, `col2`, `col3`) me servirá para indexar: a. `col1` solamente b. `col1`, `col2` c. las tres columnas juntas

no me servirá para indexar `col3` sola, p.ej.

espero haber sido claro. saludos.