MySQL - 将MyISAM转换为InnoDB,获得错误1075

时间:2013-01-31 00:39:47

标签: mysql innodb

我正在尝试将表从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

3 个答案:

答案 0 :(得分:2)

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

KEY `idx_id` (`id`)

我对(cart_id, id)上复合PK的使用提出了质疑,因为根据定义id只是一个唯一的值。也许你应该让PK id,并在组合中创建一个单独的索引。

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

甚至不需要将其指定为UNIQUE,因为AUTO_INCREMENT无论如何都无法重复。无法违反组合(cart_id, id)的唯一性。

答案 1 :(得分:2)

AUTO_INCREMENT列应定义为键,与错误相同

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

并在两列上设置UNIQUE而不是主键

UNIQUE (`cart_id`,`id`),

答案 2 :(得分:2)

您在MyISAM表上所做的工作无法通过InnoDB完成。请参阅我对(类似)问题的回答: creating primary key based on date

MySQL文档,在 Using AUTO_INCREMENT 部分中解释它:

  

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


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