背景:我有一个名为Contact的数据库表。我的系统的所有用户在此表中都有其联系方式的详细信息,包括名字,姓氏以及称为“ UniqueId”的varchar字段。系统用户可以将任何东西放在UniqueId字段中,只要它与该用户的其他联系人的唯一ID是唯一的即可。

目的:现在,我需要更改代码,以便如果用户不提供唯一ID,则会自动生成一个唯一ID。这应该简短且视觉上令人愉悦。理想情况下,它可以是一个自动递增的数字。但是,AUTO_INCREMENT适用于整数字段,而不是varchar字段。

还要注意,每个联系人的UniqueId必须与该用户的其他联系人唯一,但不一定对整个系统唯一。因此,以下UniqueIds有效:

Contact
    UserId  Firstname Lastname UniqueId
    1       Bob       Jones    1
    1       Harold    Smith    2
    2       Joe       Bloggs   1


问题:那我该如何实现呢?有没有一种可靠且干净的方法来使数据库为现有的UniqueId varchar字段中的每个联系人生成唯一的ID(如果可能,我的偏好是哪个)?还是我被迫让Java运行并获取下一个可用的唯一ID,如果是这样,最可靠的方法是什么?还是其他替代解决方案?

编辑-4月11日上午:我们使用休眠模式来映射字段。我刚刚开始研究是否可以提供替代解决方案?有什么意见吗?

编辑-4月11日下午:当前有2个选项非常突出,但都不是我想要的理想选择。

1.正如@eis所建议的,除了当前的varchar字段之外,我还可以具有一个自动递增的字段。然后,在保存联系人时,也可以将int保存在varchar字段中,或者在检索联系人时,如果varchar为空,则可以使用int。但是使用两个字段而不是一个字段感到混乱和错误

2.我正在研究使用休眠生成器,如here所述。但这涉及在下一个id和Java代码的其他位置保存计数,并且似乎使该过程过于复杂。

如果我现有的uniqueId字段是一个int字段,则AUTO_INCREMENT可以正常工作,并且运行良好。有没有办法让数据库生成此结果,而是将其另存为字符串?

最佳答案

我认为您真正应该做的是抛弃当前的“唯一标识”,并生成在整个系统中真正独一无二的新标识,这些新标识始终是自动生成的,并且永远不会由用户提供。您需要做单独的工作才能迁移到新系统。这是我认为保持理智的唯一方法。如果需要,用户可以提供类似别名的名称,以使其在视觉上更令人愉悦。

从好的方面来说,您可以使用自动增量。



好吧,如果您真的想要您要的东西,那么还有一个选择。您可能有一个前缀§§§§不允许用户使用,并且总是根据该前缀自动生成ID,例如§§§§1§§§§2等。如果您不允许最终用户以该前缀开头的任何内容,知道不会有冲突,您可以在需要时一一生成它们。

序列是生成数字的理想选择。 MySQL中没有序列,但是您可以模拟它们,例如like this

09-11 18:58
查看更多