Il ne peut y avoir qu'une seule colonne automatique

105

Comment corriger l'erreur de MySQL «vous ne pouvez avoir qu'une seule colonne d'incrémentation automatique».

CREATE TABLE book (
   id INT AUTO_INCREMENT NOT NULL,
   accepted_terms BIT(1) NOT NULL,
   accepted_privacy BIT(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
BuddyJoe
la source

Réponses:

120

My MySQL says "Incorrect table definition; there can be only one auto column and it must be defined as a key" So when I added primary key as below it started working:

CREATE TABLE book (
   id INT AUTO_INCREMENT NOT NULL,
   accepted_terms BIT(1) NOT NULL,
   accepted_privacy BIT(1) NOT NULL,
   primary key (id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
emstol
la source
6
Quelle est la bonne marche à suivre si la colonne fait partie d'une clé composite?
Nubcake
Quelle est la syntaxe lors de la modification de la table?
Mike Harrison
2
@MikeHarrison semble que vous pouvez simplement mettre ALTER TABLE book ADD id INT AUTO_INCREMENT NOT NULL, ADD PRIMARY KEY (id);
suxur
34

Le message d'erreur complet retentit:

ERREUR 1075 (42000): définition de table incorrecte; il ne peut y avoir qu'une seule colonne automatique et elle doit être définie comme clé

Alors ajoutez primary keyau auto_incrementchamp:

CREATE TABLE book (
   id INT AUTO_INCREMENT primary key NOT NULL,
   accepted_terms BIT(1) NOT NULL,
   accepted_privacy BIT(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
TMS
la source
13

Notez également que «clé» ne signifie pas nécessairement clé primaire . Quelque chose comme ça fonctionnera:

CREATE TABLE book (
    isbn             BIGINT NOT NULL PRIMARY KEY,
    id               INT    NOT NULL AUTO_INCREMENT,
    accepted_terms   BIT(1) NOT NULL,
    accepted_privacy BIT(1) NOT NULL,
    INDEX(id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Ceci est un exemple artificiel et probablement pas la meilleure idée, mais il peut être très utile dans certains cas.

Matthieu Lire
la source
Cela m'a aidé dans une situation où je voulais définir une clé composite pour une mise à jour facile, mais je voulais également avoir un ID auto-incrémenté à des fins de débogage. Y a-t-il quelque chose dont je devrais être conscient en termes de risque, à part éventuellement des écritures légèrement plus lentes?
Mattias Martens
2
@Mattias Non, je ne pense pas qu'il y ait de risque particulier. Ceci est intentionnellement pris en charge, la colonne auto étant la clé primaire purement par convention (et pour plus de simplicité).
Matthieu a lu
5
CREATE TABLE book (
   id INT AUTO_INCREMENT primary key NOT NULL,
   accepted_terms BIT(1) NOT NULL,
   accepted_privacy BIT(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
Déept Raghav
la source