【问题标题】:Innodb doesn't let me update the composite primary key?Innodb 不允许我更新复合主键?
【发布时间】: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 的原因,它默认执行表锁定。

标签: mysql innodb


【解决方案1】:

两种猜测:

方案 A:交换 MODIFY idDROP PK

B 计划:拆分为两个 ALTER。但我不知道在哪里。我认为问题在于ALTER 在更换PK 之前还没有完全放开id-PK 链接。所以,至少,将ADD PK 移动到第二个ALTER

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    • 2016-09-29
    • 2018-10-06
    • 2017-09-04
    • 2021-08-01
    相关资源
    最近更新 更多