Может быть только один автоматический столбец

105

Как мне исправить ошибку MySQL «у вас может быть только один столбец с автоматическим увеличением».

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
источник

Ответы:

120

Мой MySQL говорит: «Неправильное определение таблицы; может быть только один автоматический столбец, и он должен быть определен как ключ ». Поэтому, когда я добавил первичный ключ, как показано ниже, он начал работать:

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
Как правильно действовать, если столбец является частью составного ключа?
Nubcake
Какой синтаксис при изменении таблицы?
Майк Харрисон,
2
@MikeHarrison, похоже, можно просто поставить ALTER TABLE book ADD id INT AUTO_INCREMENT NOT NULL, ADD PRIMARY KEY (id);
suxur
34

Полное сообщение об ошибке звучит:

ОШИБКА 1075 (42000): неправильное определение таблицы; может быть только один автоматический столбец, и он должен быть определен как ключ

Так что добавьте primary keyв auto_incrementполе:

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

Также обратите внимание, что «ключ» не обязательно означает первичный ключ. Примерно так будет работать:

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;

Это надуманный пример и, вероятно, не лучшая идея, но в некоторых случаях он может быть очень полезен.

Мэтью Рид
источник
Это помогло мне в ситуации, когда я хотел определить составной ключ для простого обновления, но я также хотел иметь автоматически увеличивающийся идентификатор для целей отладки. Есть ли что-нибудь, о чем я должен знать с точки зрения риска, кроме, возможно, немного более медленной записи?
Маттиас Мартенс
2
@Mattias Нет, я не верю, что есть особый риск. Это поддерживается намеренно, поскольку автоматический столбец является первичным ключом исключительно по соглашению (и для простоты).
Мэтью Рид
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
Глубокий Рагхав
источник