2011-11-13 16 views
20

Aquí es una tabla en MySQL 5.3.x + db:MySQL: # 1075 - Definición de tabla incorrecta; autoincrement vs otra clave?

CREATE TABLE members` (
    `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `memberid` VARCHAR(30) NOT NULL , 
    `Time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP , 
    `firstname` VARCHAR(50) NULL , 
    `lastname` VARCHAR(50) NULL , 
    UNIQUE (memberid), 
    PRIMARY KEY (id) 
) ENGINE = MYISAM; 

Id columna nunca se utiliza en las consultas, es sólo por comodidad visual (por lo que es fácil ver cómo crece la tabla). Memberid es una clave real, es único y memberid se utiliza en consultas para identificar a cualquier miembro (WHERE memberid = 'abcde').

Mi pregunta es: ¿cómo mantener auto_increment, pero hacer memberid como clave principal? ¿Es eso posible? Cuando intento para crear esta mesa con PRIMARY KEY (memberId), me sale un error:

1075 - Incorrect table definition; there can be only one auto column and it must be defined as a key

¿Cuál es la mejor opción (Con suerte, hay una manera de mantener la columna ID lo que el rendimiento es bueno y las consultas identifican a cualquier usuario por memberid, no por id), si el rendimiento es muy importante (aunque el espacio en disco no lo es)?

Respuesta

41

Usted puede tener una columna de incremento automático que no es el PRIMARY KEY, siempre y cuando hay un índice (clave) en él:

CREATE TABLE members ( 
    id int(11) UNSIGNED NOT NULL AUTO_INCREMENT, 
    memberid VARCHAR(30) NOT NULL , 
    `time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP , 
    firstname VARCHAR(50) NULL , 
    lastname VARCHAR(50) NULL , 
    PRIMARY KEY (memberid) , 
    KEY (id)       --- or: UNIQUE KEY (id) 
) ENGINE = MYISAM; 
+0

+1 y gracias por el comentario, aprendí algo hoy :) –

4

Puede hacer que el ID sea la clave principal y establecer member_id en NOT NULL UNIQUE. (Lo que has hecho). Las columnas que son NOT NULL UNIQUE pueden ser el objetivo de referencias de clave externa, al igual que una clave principal. (Estoy bastante seguro de que es cierto para todas las plataformas SQL.)

En el nivel conceptual, no hay diferencia entre PRIMARY KEY y NOT NULL UNIQUE. En el nivel físico, este es un problema de MySQL; otras plataformas SQL te permitirán usar una secuencia sin convertirla en la clave principal.

Pero si el rendimiento es realmente importante, debe pensar dos veces antes de ampliar su tabla en cuatro bytes por fila para obtener una comodidad visual muy pequeña. Además, si cambia a INNODB para imponer restricciones de clave externa, MySQL usará su clave principal en un índice agrupado. Como no estás usando tu llave primaria, imagino que eso podría perjudicar el rendimiento.

0

Para el problema anterior, en primer lugar, si suponen las tablas contienen más de 1 clave primaria, luego primero elimine todas esas claves primarias y agregue el primer campo de INCREMENTO AUTOMÁTICO como clave principal, luego agregue otras claves principales requeridas que se eliminen antes. Establezca la opción AUTO INCREMENT para el campo requerido en el área de opciones.

0

Creo que entiendo cuál es el motivo de su error. Primero haga clic en el campo AUTO AUTO INCREMENT y luego selecciónelo como clave principal.

The Right way is First You have to select it as a primary key then you have to click auto AUTO INCREMENT field.

Muy fácil.Gracias

4

En primer lugar crear la tabla sin AUTO_INCREMENT,

CREATE TABLE `members`(
    `id` int(11) NOT NULL, 
    `memberid` VARCHAR(30) NOT NULL , 
    `Time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP , 
    `firstname` VARCHAR(50) NULL , 
    `lastname` VARCHAR(50) NULL 
    PRIMARY KEY (memberid) 
) ENGINE = MYISAM; 

después de Identificación del conjunto como índice,

ALTER TABLE `members` ADD INDEX(`id`); 

después de Identificación del conjunto como AUTO_INCREMENT,

ALTER TABLE `members` CHANGE `id` `id` INT(11) NOT NULL AUTO_INCREMENT; 

O

CREATE TABLE IF NOT EXISTS `members` (
    `id` int(11) NOT NULL, 
    `memberid` VARCHAR(30) NOT NULL , 
    `Time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP , 
    `firstname` VARCHAR(50) NULL , 
    `lastname` VARCHAR(50) NULL, 
     PRIMARY KEY (`memberid`), 
     KEY `id` (`id`) 
) ENGINE=MYISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 
Cuestiones relacionadas