English 中文(简体)
你能在MySql中使用自动递增而不将其作为主键吗?
原标题:
  • 时间:2009-03-11 12:04:34
  •  标签:

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

我的应用程序使用MySql 5和nhibernate作为ORM。

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

  • 将主键更改为自增字段,但仍保留ID作为GUID,以使我的应用程序保持一致性。

  • 使用GUID和自增字段创建复合主键。

我目前的想法倾向于使用组合键的概念。

编辑:行ID(主键)当前为GUID。我想添加一个自增的INT字段,以便它易于人读取。我只是不想远离应用程序中当前标准的GUID作为主键。

最佳回答

一个GUID值旨在在表和数据库中是唯一的,因此,请将auto_increment列设置为主索引,并为GUID创建一个UNIQUE索引。 一个GUID值旨在在表和数据库中是唯一的,因此,请将auto_increment列设置为主索引,并为GUID创建一个UNIQUE索引。

问题回答

我会倾向于另一边。

为什么?因为创建组合键会给下一个来的人留下这样的印象:在表中两次使用相同的GUID但具有不同的序列编号是可以的。

一些想法:

  • 如果你的GUID是自动递增且唯一的,为什么不让它成为实际的主键呢?

  • 另一方面,您永远不应基于程序问题做出语义决策:您的问题是MySQL问题,而不是您的DB设计问题。

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

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

  • 在插入之前,开始一个事务(确保自动提交设置为false),找出最新的GUID,增加并使用新值进行插入。换句话说,不是自动自增的:P

GUID不打算排序,这就是为什么对于它们,AUTO_INCREMENT毫无意义的原因。

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

生成一个新的GUID,只需在INSERT语句或触发器中调用UUID()函数。

不,只有主键可以将其值设置为自动增量。

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





相关问题
热门标签