Może być tylko jedna kolumna automatyczna

105

Jak poprawić błąd z MySQL „możesz mieć tylko jedną kolumnę z automatycznym zwiększaniem”.

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
źródło

Odpowiedzi:

120

MySQL mówi „Nieprawidłowa definicja tabeli; może być tylko jedna kolumna automatyczna i musi być zdefiniowana jako klucz ”. Po dodaniu klucza podstawowego, jak poniżej, zaczęło działać:

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
źródło
6
Jaki jest właściwy sposób postępowania, jeśli kolumna jest częścią klucza złożonego?
Nubcake
Jaka jest składnia podczas zmiany tabeli?
Mike Harrison
2
@MikeHarrison wygląda na to, że możesz po prostu umieścić ALTER TABLE book ADD id INT AUTO_INCREMENT NOT NULL, ADD PRIMARY KEY (id);
suxur
34

Pełny komunikat o błędzie brzmi:

ERROR 1075 (42000): Niepoprawna definicja tabeli; może istnieć tylko jedna kolumna automatyczna i musi być zdefiniowana jako klucz

Więc dodaj primary keydo auto_incrementpola:

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
źródło
13

Należy również zauważyć, że „klucz” niekoniecznie oznacza klucz podstawowy . Coś takiego zadziała:

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;

Jest to wymyślony przykład i prawdopodobnie nie jest to najlepszy pomysł, ale w niektórych przypadkach może być bardzo przydatny.

Matthew Read
źródło
Pomogło mi to w sytuacji, gdy chciałem zdefiniować klucz złożony do łatwej aktualizacji, ale chciałem też mieć identyfikator automatycznie zwiększający się do celów debugowania. Czy jest coś, czego powinienem być świadomy pod względem ryzyka, poza możliwym nieco wolniejszym zapisem?
Mattias Martens,
2
@Mattias Nie, nie wierzę, że istnieje jakieś szczególne ryzyko. Jest to celowo obsługiwane, ponieważ kolumna auto jest kluczem podstawowym wyłącznie przez konwencję (i dla uproszczenia).
Matthew Przeczytaj
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
źródło