【发布时间】:2019-05-01 07:21:06
【问题描述】:
我正在尝试创建一个历史表来存储其对应表的所有历史记录
但是,当我从 MyISAM 切换到 InnoDB 时(因为 DELETE ON CASCADE),以下查询会产生错误:Incorrect table definition; there can be only one auto column and it must be defined as a key
CREATE TABLE tdm_history.BATCH LIKE tdm.BATCH;
ALTER TABLE tdm_history.BATCH MODIFY COLUMN id int NOT NULL,
DROP PRIMARY KEY, ADD action VARCHAR(8) DEFAULT 'insert',
ADD revision INT NOT NULL AUTO_INCREMENT,
ADD stamp DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
ADD PRIMARY KEY (id, revision);
我希望将 id 中的 tdm_history.BATCH 的主键更改为 (id, revision) 的复合主键。
请注意,当引擎设置为 MyISAM 时,上述查询可以正常工作
【问题讨论】:
-
'对于 InnoDB 表,必须将 AUTO_INCREMENT 列定义为索引的一部分'dev.mysql.com/doc/refman/8.0/en/… - 不一定是主键,但如果你愿意,如果不是在某种程度上贬低自动增量(id,revision) 是唯一的,那么你可以创建一个唯一的索引。
-
@P.Salmon 谢谢!我应该检查文件。添加索引解决了这个问题。
-
请注意,它在 InnoDB 中的行为会有所不同。对于
id的每个值,自动递增列不会从 1 开始编号revision。它只会不断增加值。 InnoDB 不支持 MyISAM 所做的每值自动增量。 -
@BillKarwin 感谢您让我知道,我确实意识到了这一点。我没有使用自动增量,而是为每个新插入重新计算
revision。你有什么更好的办法吗? -
这行得通,除非您有并发请求尝试插入。除非您可以创建锁以确保并发插入串行运行,否则您会遇到竞争条件。这就是它适用于 MyISAM 的原因,它默认执行表锁定。