我使用GUID作为我所有其他表的主键,但我有一个需要增加数字的要求 . 我尝试使用自动增量在表中创建一个字段,但MySql抱怨它需要是主键 .
我的应用程序使用MySql 5,nhibernate作为ORM .
我想到的可能的解决方案是:
-
将主键更改为自动增量字段,但仍将Id作为GUID,以便我的应用程序的其余部分保持一致 .
-
使用GUID和自动增量字段创建复合键 .
我现在的想法是倾向于复合的关键想法 .
编辑:行ID(主键)是当前的GUID . 我想添加一个自动增量的INT字段,以便它是人类可读的 . 我只是不想放弃使用GUID作为主键的应用程序中的当前标准 .
6 回答
GUID值旨在在表甚至数据库中是唯一的,因此,使auto_increment列为主索引并为GUID创建UNIQUE索引
我会倾向于另一种方式 .
为什么?因为创建一个复合键给下一个人的印象,可以在表中使用相同的GUID两次,但序列号不同 .
几点想法:
如果您的GUID是非常复杂且唯一的,为什么不让它成为实际的主键?
另一方面,你不应该根据程序问题做出语义决定:你有MySQL的问题,而不是数据库的设计 .
所以,这里有几个解决方法:
创建一个触发器,一旦插入GUID就将GUID设置为正确的值 . 这是MySQL问题的MySQL解决方案,无需更改架构的语义 .
在插入之前,启动事务(确保自动提交设置为false),找出最新的GUID,增加并插入新值 . 换句话说,不会自动增加自动增量:P
GUID
's are not intended to be orderable, that'为什么AUTO_INCREMENT
对他们来说没有意义 .但是,您可以在
MyISAM
表中使用AUTO_INCREMENT
作为复合主键的第二列 . 您可以在(GUID, INT)
列上创建复合键,并使第二列为AUTO_INCREMENT
.要生成新的
GUID
,只需在INSERT
语句或触发器中调用UUID()
.不,只有主键可以将auto_increment作为其值 .
如果由于某种原因,您无法将标识列更改为主键,那么通过某种SEQUENCE表手动生成自动增量以及查询SEQUENCE表并保存下一个要使用的值的触发器 . 然后将值分配给触发器中的目标表 . 同样的效果 . 我唯一的问题是,如果不重新选择表,自动递增的值是否会通过NHibernate返回 .