1

テーブルを MyISAM から InnoDB に変換しようとしています。これが定義であり、エラーが発生しています。#1075 - Incorrect table definition; there can be only one auto column and it must be defined as a key

テーブルには AutoIncrement 値があり、フィールドにはインデックスが付けられており、MyISAM で動作します。私はInnoDBを初めて使用するので、ばかげた質問かもしれません

CREATE TABLE `cart_item` (
 `cart_id` int(10) unsigned NOT NULL DEFAULT '0',
 `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
 `design_number` int(10) unsigned NOT NULL,
 `logo_position_id` smallint(5) unsigned NOT NULL,
 `subst_style_id` varchar(10) DEFAULT NULL,
 `style_id` varchar(10) NOT NULL DEFAULT '',
 `subst_color_id` smallint(5) unsigned DEFAULT NULL,
 `color_id` smallint(5) unsigned NOT NULL,
 `size_id` smallint(5) unsigned NOT NULL,
 `qty` mediumint(8) unsigned NOT NULL,
 `active` enum('y','n') NOT NULL DEFAULT 'y',
 `date_last_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 `last_modified_by_id` mediumint(5) unsigned NOT NULL,
 `date_last_locked` datetime DEFAULT NULL,
 `last_locked_by_id` smallint(5) unsigned NOT NULL,
 `date_added` datetime NOT NULL,
 `subsite_logo_group_id` int(11) NOT NULL,
 `bundle` varchar(32) NOT NULL,
 `color_stop_1` varchar(4) DEFAULT NULL,
 PRIMARY KEY (`cart_id`,`id`),
 KEY `color_id` (`color_id`),
 KEY `style_id` (`style_id`),
 KEY `size_id` (`size_id`),
 KEY `design_number` (`design_number`),
 KEY `subsite_logo_group_id` (`subsite_logo_group_id`),
 KEY `date_added` (`date_added`),
 KEY `bundle` (`bundle`)
) ENGINE=InnoDB
4

3 に答える 3

2

MyISAMテーブルで行っていたことは、InnoDBでは実行できません。(同様の)問題に関する私の答えを参照してください:日付に基づいて主キーを作成する

MySQLのドキュメントでは、「使用AUTO_INCREMENT」セクションで次のように説明しています。

MyISAMテーブルの場合、複数列インデックスAUTO_INCREMENT2次列で指定できます。この場合、列の生成値はとして計算されます。これは、データを順序付けられたグループに入れたい場合に役立ちます。AUTO_INCREMENTMAX(auto_increment_column) + 1 WHERE prefix=given-prefix


InnoDBでも同様の動作が得られる場合がありますが、ではありませんAUTO_INCREMENTcart_id(あたりの)自動インクリメントを処理するインサートには、ファンシートリガーまたはストアドプロシージャのいずれかを使用する必要があります。

于 2013-01-31T00:57:22.320 に答える
2

にコンポジットPRIMARY KEYを定義しています(cart_id, id)が、にAUTO_INCREMENTはインデックスidのみが必要です。そのためにを追加できますKEY(主キーではなく、単なるインデックス):

KEY `idx_id` (`id`)

(cart_id, id)ただし、複合PKの使用については疑問があります。これidは、定義上、それだけで一意の値であるためです。おそらくid、PKを作成し、組み合わせ全体で個別のインデックスを作成する必要があります。

PRIMARY KEY (`id`),
KEY (`cart_id`, `id`)

とにかく繰り返すことができないUNIQUEので、指定する必要はありません。AUTO_INCREMENT組み合わせの一意性を侵害する方法はありません(cart_id, id)

于 2013-01-31T00:42:47.483 に答える
2

AUTO_INCREMENTエラーが示すように、列はキーとして定義する必要があります。

`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,

UNIQUE主キーの代わりに2列に設定します

UNIQUE (`cart_id`,`id`),
于 2013-01-31T00:43:27.880 に答える