自動列は1つしか存在できません


104

MySQLのエラー「自動インクリメントカラムは1つしか持てない」を修正するにはどうすればよいですか。

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;

回答:


119

私のMySQLは「テーブル定義が正しくありません。自動列は1つしか存在できず、キーとして定義する必要があります」なので、以下のように主キーを追加すると、機能し始めました。

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 2017

テーブルを変更するときの構文は何ですか?
マイクハリソン

2
@MikeHarrisonはあなたがALTER TABLE book ADD id INT AUTO_INCREMENT NOT NULL, ADD PRIMARY KEY (id);
そのまま

34

完全なエラーメッセージが鳴ります。

エラー1075(42000):テーブル定義が正しくありません。自動列は1つしか存在できず、キーとして定義する必要があります

したがって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を取得したいという状況で役立ちました。書き込みが少し遅いことを除いて、リスクに関して注意すべき点はありますか?
マティアスマルテンス

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.