只能有一个自动列


104

我该如何从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;

Answers:


119

我的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

更改表格时的语法是什么?
Mike Harrison

2
@MikeHarrison看起来您可以放下 ALTER TABLE book ADD id INT AUTO_INCREMENT NOT NULL, ADD PRIMARY KEY (id);
suxur

34

完整的错误消息听起来是:

错误1075(42000):错误的表格定义;只能有一个自动列,并且必须将其定义为键

因此,添加primary keyauto_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;

这是一个人为的示例,可能不是最好的主意,但是在某些情况下它可能非常有用。


这在我想定义一个易于更新的组合键的情况下为我提供了帮助,但同时我也想拥有一个用于调试目的的自动递增ID。除了可能稍微慢一点的写入之外,在风险方面我还有什么要注意的吗?
Mattias Martens

2
@Mattias不,我认为没有特别的风险。这是有意支持的,而auto列纯粹是约定的主键(为简单起见)。

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.