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

PRIMARY KEY您在上定义了一个组合(cart_id, id),但它AUTO_INCREMENT需要一个id单独的索引。您可以为其添加一个KEY(不是主键,而只是一个普通索引):

KEY `idx_id` (`id`)

不过,我质疑复合 PK 的使用(cart_id, id),因为id根据定义,它本身就是一个独特的值。也许您应该进行idPK,并在组合中创建一个单独的索引。

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在两列而不是主键

UNIQUE (`cart_id`,`id`),
于 2013-01-31T00:43:27.880 回答
2

你在 MyISAM 表上做的事情,不能用 InnoDB 做。请参阅我对(类似)问题的回答:根据日期创建主键

MySQL 文档,在UsingAUTO_INCREMENT部分,解释它:

对于MyISAM 表,您可以在多列索引AUTO_INCREMENT中的辅助列上指定。在这种情况下,列的生成值计算为。当您要将数据放入有序组时,这很有用。AUTO_INCREMENTMAX(auto_increment_column) + 1 WHERE prefix=given-prefix


您可能会在 InnoDB 中得到类似的行为,但不会在AUTO_INCREMENT. 您必须为您的插入使用一些花哨的触发器或存储过程来处理(每个cart_id)自动增量。

于 2013-01-31T00:57:22.320 回答