【问题标题】:Emulate MyISAM's composite primary key with an autoincrement behavior in InnoDB在 InnoDB 中使用自动增量行为模拟 MyISAM 的复合主键
【发布时间】:2013-06-11 23:39:37
【问题描述】:

在 MySQL 中,如果您的 MyISAM 表类似于:

CREATE TABLE `table1` (
`col1` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`col2` INT(10) UNSIGNED NOT NULL,
PRIMARY KEY (`col2`, `col1`)
)
COLLATE='utf8_general_ci'
ENGINE=MyISAM;

如果您插入行,则自动增量基数对于每个不同的 col2 值都是唯一的。如果我的解释不够清楚,this 答案应该解释得更好。然而,InnoDB 不遵循这种行为。事实上,InnoDB 甚至不允许您将 col2 作为主键定义中的第一个。

我的问题是,是否可以在不使用 MAX(id)+1 之类的方法的情况下以某种方式在 InnoDB 中对这种行为进行建模?我能找到的最接近的是this,但它适用于 PostgreSQL。

编辑:标题拼写错误

【问题讨论】:

  • 对于像我一样不知道这个功能的人,the phrasing in the manual 可能更明确:“对于 MyISAM 表,您可以在多列索引的辅助列上指定 AUTO_INCREMENT . 在这种情况下,AUTO_INCREMENT 列的生成值计算为MAX(auto_increment_column) + 1 WHERE prefix=given-prefix
  • 作为解决方案,我看不到其他选择,只能按照您提到的帖子中的建议在您的桌子上创建触发器。 MySQL is not that different中的触发器语法。

标签: mysql database-design innodb myisam


【解决方案1】:

这是我以前使用过的 MyISAM 的一个简洁功能,但你不能用 InnoDB 做到这一点。 InnoDB 在启动时确定最大数字,然后将数字保存在 RAM 中并在需要时增加它。

由于 InnoDB 处理同时插入/更新,它必须在事务开始时保留数字。在事务回滚时,该数字仍然“使用”但未保存。因此,您的 MAX(id) 解决方案可能会给您带来麻烦。一个事务开始,号码被保留,你在一个单独的事务中拉出最高的“保存”号码+1,这与为第一个事务保留的相同。交易完成,保留的号码现在被保存,与您的冲突。

MAX(id) 返回最高保存的数字,而不是最高使用的数字。您可以拥有一个 MyISAM 表,其唯一目的是生成您想要的数字。它与您的 MAX(id) 解决方案的查询数量相同,只是一个是 SELECT,另一个是 INSERT。

【讨论】:

    猜你喜欢
    • 2012-08-11
    • 2011-03-18
    • 2012-12-14
    • 1970-01-01
    • 2016-11-11
    • 2017-10-14
    • 2011-06-30
    • 1970-01-01
    相关资源
    最近更新 更多