Es kann nur eine automatische Spalte geben

104

Wie korrigiere ich den Fehler von MySQL? Sie können nur eine automatische Inkrementierungsspalte haben.

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
quelle

Antworten:

119

Mein MySQL sagt "Falsche Tabellendefinition; es kann nur eine automatische Spalte geben und sie muss als Schlüssel definiert werden ". Als ich also den Primärschlüssel wie unten hinzufügte, fing es an zu funktionieren:

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
quelle
6
Was ist die richtige Vorgehensweise, wenn die Spalte Teil eines zusammengesetzten Schlüssels ist?
Nubcake
Wie lautet die Syntax beim Ändern der Tabelle?
Mike Harrison
2
@ MikeHarrison sieht aus wie Sie nur setzen können ALTER TABLE book ADD id INT AUTO_INCREMENT NOT NULL, ADD PRIMARY KEY (id);
suxur
34

Die vollständige Fehlermeldung ertönt:

FEHLER 1075 (42000): Falsche Tabellendefinition; Es kann nur eine automatische Spalte geben, die als Schlüssel definiert werden muss

Fügen Sie also primary keydem auto_incrementFeld hinzu:

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
quelle
13

Beachten Sie auch, dass "Schlüssel" nicht unbedingt Primärschlüssel bedeutet . So etwas wird funktionieren:

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;

Dies ist ein erfundenes Beispiel und wahrscheinlich nicht die beste Idee, aber es kann in bestimmten Fällen sehr nützlich sein.

Matthew Read
quelle
Dies half mir in einer Situation, in der ich einen zusammengesetzten Schlüssel für eine einfache Aktualisierung definieren wollte, aber auch eine automatisch inkrementierende ID für Debugging-Zwecke haben wollte. Gibt es etwas, das ich in Bezug auf das Risiko beachten sollte, abgesehen von möglicherweise etwas langsameren Schreibvorgängen?
Mattias Martens
2
@ Mattias Nein, ich glaube nicht, dass es ein besonderes Risiko gibt. Dies wird absichtlich unterstützt, wobei die Auto-Spalte rein konventionell (und der Einfachheit halber) der Primärschlüssel ist.
Matthew Read
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
Deept Raghav
quelle