web-dev-qa-db-fra.com

MySQL: # 1075 - Définition de table incorrecte; autoincrement vs une autre clé?

Voici un tableau dans MySQL 5.3.X + db:

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 column n'est jamais utilisé dans les requêtes, il sert uniquement à la commodité visuelle (il est donc facile de voir comment la table se développe). Memberid est une clé réelle, est unique et memberid est utilisé dans les requêtes pour identifier un membre (WHERE memberid = 'abcde').

Ma question est la suivante: comment conserver auto_increment, tout en faisant membre id comme clé primaire? Est-ce possible? Lorsque j'essaie de créer cette table avec PRIMARY KEY (memberid) , j'obtiens une erreur:

1075 - Définition de table incorrecte; il ne peut y avoir qu'une seule colonne automatique et elle doit être définie comme une clé

Quel est le meilleur choix (j'espère qu'il existe un moyen de conserver la colonne id afin que les performances soient bonnes et que les requêtes identifient un utilisateur par membre, et non par id), si les performances sont très importantes (bien que l'espace disque ne le soit pas)?

26
Haradzieniec

Vous pouvez avoir une colonne auto-incrémentée qui n'est pas le PRIMARY KEY, tant qu'elle contient un index (clé):

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; 
47
ypercubeᵀᴹ

Tout d'abord créer une table sans 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;

après avoir défini l'ID comme index,

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

après avoir défini l'identifiant auto_increment,

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

Ou 

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 ;
10
Thilina Sampath

Vous pouvez définir l'id comme clé primaire et définir member_id sur NOT NULL UNIQUE. (Ce que vous avez fait.) Les colonnes qui sont NOT NULL UNIQUE peuvent être la cible de références de clé étrangère, tout comme une clé primaire. (Je suis presque sûr que c'est le cas de toutes les plateformes SQL.)

Au niveau conceptuel, il n'y a pas de différence entre PRIMARY KEY et NOT NULL UNIQUE. Au niveau physique, il s’agit d’un problème lié à MySQL; d'autres plates-formes SQL vous permettront d'utiliser une séquence sans en faire la clé primaire. 

Mais si les performances sont vraiment importantes, vous devriez réfléchir à deux fois avant d’élargir votre tableau de quatre octets par ligne pour un confort visuel aussi minime. De plus, si vous passez à INNODB pour appliquer des contraintes de clé étrangère, MySQL utilisera votre clé primaire dans un index en cluster. Puisque vous n'utilisez pas votre clé primaire, j'imagine que cela pourrait nuire aux performances.

Pour le problème ci-dessus, tout d’abord si les tables supposées contiennent plus d’une clé primaire, supprimez d’abord toutes ces clés primaires et ajoutez le premier champ AUTO INCREMENT en tant que clé primaire, puis ajoutez une autre clé primaire requise, supprimée précédemment. Définissez l'option AUTO INCREMENT pour le champ requis dans la zone des options.

1
Vikram Gharge

Je pense que je comprends quelle est la raison de votre erreur ... Tout d’abord, vous cliquez sur le champ auto AUTO INCREMENT, puis sélectionnez-le comme clé primaire.

La bonne façon est d'abord, vous devez le sélectionner comme clé primaire, puis vous devez cliquer sur le champ auto AUTO INCREMENT.

Très facile . Merci