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;

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;

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;

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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.