只能有一个自动列

Bud*_*Joe 92 mysql ddl

如何更正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;
Run Code Online (Sandbox Code Playgroud)

ems*_*tol 103

我的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;
Run Code Online (Sandbox Code Playgroud)

  • 如果列是复合键的一部分,那么正确的操作过程是什么? (3认同)
  • 更改表时的语法是什么? (2认同)
  • @MikeHarrison看起来您可以将`ALTER TABLE book ADD ID INT AUTO_INCREMENT NOT NULL,ADD PRIMARY KEY(id);`放进去。 (2认同)

TMS*_*TMS 31

完整的错误消息响起:

错误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;
Run Code Online (Sandbox Code Playgroud)


Mat*_*ead 7

还请注意,“键”不一定表示键。这样的事情会起作用:

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;
Run Code Online (Sandbox Code Playgroud)

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

  • @Mattias 不,我认为没有任何特别的风险。这是有意支持的, auto 列纯粹是按照惯例(为了简单起见)作为主键。 (3认同)
  • 这在我想定义一个复合键以便于更新的情况下帮助我,但我也想有一个自动递增的 ID 用于调试目的。除了写入速度可能稍慢之外,在风险方面还有什么我应该注意的吗? (2认同)

Dee*_*hav 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
Run Code Online (Sandbox Code Playgroud)