【问题标题】:MySQL auto_increment on composite key no longer supported?不再支持复合键上的 MySQL auto_increment?
【发布时间】:2015-06-09 23:34:19
【问题描述】:

我有一台运行旧 MySQL 版本 (5.5.41) 的服务器,支持以下功能:

create table mytest33
(
    topicnum mediumint, 
    postnum mediumint auto_increment, 
    primary key (topicnum,postnum)
);

所以当我在这个表中插入值时,它会是这样的:

Topicnum  Postnum
1         1
1         2
2         1

等等。因此,如果 topicnum 不同,则 postnum 值将返回 1。

这不再受支持 - 当我尝试在 MySQL 版本 5.6.17 中创建同一个表时,我收到一个错误:

ERROR 1075 (42000):表定义不正确;只能有一个自动列,并且必须将其定义为键。

我正在使用 MyISAM 引擎。

我该如何解决这个问题?

【问题讨论】:

  • 创建表 mytest33(topicnum mediumint, postnum mediumint, 主键 (topicnum,postnum));试试这个效果很好。
  • 您的原始版本是否有保持顺序的触发器?我不知道 MySQL 曾经直接支持此功能。
  • salil:确定可行,但它不包括 auto_increment..
  • 戈登 - 没有设置触发器或其他任何东西,没有。我发布的查询最初在旧版本的 MySQL 中运行良好,例如 5.5.41。

标签: mysql sql


【解决方案1】:

据我了解,这里是你需要执行的命令:-

create table mytest33(topicnum mediumint, postnum mediumint auto_increment,index(postnum), primary key (topicnum,postnum));

您可以从这里获得更多信息:- Mysql Innodb: Autoincrement non-Primary Key.

希望对您有所帮助。 祝你有美好的一天!

【讨论】:

  • 谢谢,该查询有效。但这并没有解决我的问题:postnum 的值不遵循 topicnum。无论 topicnum 是什么,每次插入新行时它都会增加 1。理想情况下,如果插入两行的 topicnum 为 1,两行的 topicnum 为 2,那么对于 topicnum 为 1 的行,postnum 的值应该是 1 和 2,对于 topicnum 为 2 的行,postnum 的值应该是 1 和 2。这就是它的方式曾经在旧版本的 MySQL 中工作。
【解决方案2】:

MyISAM 引擎具有该功能,并且仍受支持。 InnoDB 从来没有这个功能。您切换到 InnoDB(这是一件好事),但被少数“缺陷”之一所困扰。

上一个答案中的链接指出INDEX(id) 让您拥有postnumAUTO_INCREMENTUNIQUE(除非您明确设置它)。但是,它不会从 1 重新开始。那更复杂; see my blog.

【讨论】:

  • 你是对的 - 如果我明确声明它是 MyISAM 表,它似乎可以按预期工作:
【解决方案3】:

所以这似乎解决了问题:

create table mytest33(
    topicnum mediumint,
    postnum mediumint auto_increment, 
    primary key (topicnum,postnum)
) ENGINE=MyISAM;

【讨论】:

    猜你喜欢
    • 2012-07-04
    • 2013-03-16
    • 2011-04-17
    • 2016-11-08
    • 2018-05-02
    • 2010-09-18
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    相关资源
    最近更新 更多