首页 文章

你可以在MySql中使用自动增量而不是主键

提问于
浏览
3

我使用GUID作为我所有其他表的主键,但我有一个需要增加数字的要求 . 我尝试使用自动增量在表中创建一个字段,但MySql抱怨它需要是主键 .

我的应用程序使用MySql 5,nhibernate作为ORM .

我想到的可能的解决方案是:

  • 将主键更改为自动增量字段,但仍将Id作为GUID,以便我的应用程序的其余部分保持一致 .

  • 使用GUID和自动增量字段创建复合键 .

我现在的想法是倾向于复合的关键想法 .

编辑:行ID(主键)是当前的GUID . 我想添加一个自动增量的INT字段,以便它是人类可读的 . 我只是不想放弃使用GUID作为主键的应用程序中的当前标准 .

6 回答

  • 0

    GUID值旨在在表甚至数据库中是唯一的,因此,使auto_increment列为主索引并为GUID创建UNIQUE索引

  • 5

    我会倾向于另一种方式 .

    为什么?因为创建一个复合键给下一个人的印象,可以在表中使用相同的GUID两次,但序列号不同 .

  • 9

    几点想法:

    • 如果您的GUID是非常复杂且唯一的,为什么不让它成为实际的主键?

    • 另一方面,你不应该根据程序问题做出语义决定:你有MySQL的问题,而不是数据库的设计 .

    所以,这里有几个解决方法:

    • 创建一个触发器,一旦插入GUID就将GUID设置为正确的值 . 这是MySQL问题的MySQL解决方案,无需更改架构的语义 .

    • 在插入之前,启动事务(确保自动提交设置为false),找出最新的GUID,增加并插入新值 . 换句话说,不会自动增加自动增量:P

  • 0

    GUID 's are not intended to be orderable, that'为什么 AUTO_INCREMENT 对他们来说没有意义 .

    但是,您可以在 MyISAM 表中使用 AUTO_INCREMENT 作为复合主键的第二列 . 您可以在 (GUID, INT) 列上创建复合键,并使第二列为 AUTO_INCREMENT .

    要生成新的 GUID ,只需在 INSERT 语句或触发器中调用 UUID() .

  • 0

    不,只有主键可以将auto_increment作为其值 .

  • 0

    如果由于某种原因,您无法将标识列更改为主键,那么通过某种SEQUENCE表手动生成自动增量以及查询SEQUENCE表并保存下一个要使用的值的触发器 . 然后将值分配给触发器中的目标表 . 同样的效果 . 我唯一的问题是,如果不重新选择表,自动递增的值是否会通过NHibernate返回 .

相关问题