3

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

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

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

  • 将主键更改为自动增量字段,但仍将 Id 作为 GUID,因此我的应用程序的其余部分是一致的。

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

我目前的想法倾向于复合关键思想。

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

4

6 回答 6

9

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

于 2009-03-11T12:26:05.783 回答
5

我会向另一个方向倾斜。

为什么?因为创建复合键会给下一个出现的人留下这样的印象,即在表中具有相同的 GUID 两次但具有不同的序列号是可以的。

于 2009-03-11T12:10:57.240 回答
0

GUID's 不是可订购的,这就是为什么AUTO_INCREMENT对他们来说没有意义。

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

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

于 2009-03-11T12:10:50.593 回答
0

几个想法:

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

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

因此,这里有几个解决方法:

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

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

于 2009-03-11T12:11:59.263 回答
0

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

于 2009-03-11T12:42:45.337 回答
0

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

于 2010-08-13T16:13:48.963 回答