0

背景:我有一个名为 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.我正在考虑使用休眠生成器,如这里所讨论的。但这涉及在别处保存下一个 id 和 Java 代码的计数,并且似乎使该过程过于复杂。

如果我现有的 uniqueId 字段是一个 int 字段,则 AUTO_INCREMENT 将简单地工作,并且工作得很好。有没有办法让数据库生成这个但将它保存为字符串?

4

2 回答 2

2

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

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


好的,如果您真的想要您所要求的,还有一个选择。您可能有一个§§§§用户永远不允许使用的前缀,并且始终基于该前缀自动生成 id,例如§§§§1§§§§2。如果您不允许最终用户以该前缀开头的任何内容,您就会知道不会发生冲突,并且您可以在需要时一一生成它们。

序列将是为其生成数字的理想选择。您在 MySQL 中没有序列,但您可以像这样模拟它们。

于 2013-04-10T16:01:20.730 回答
0

抱歉,我真的不知道 MySQL 的语法,但这是我在 SQL Server 中的做法。希望这对你仍然有一些价值。基本上,我只是在计算现有联系人的数量并将其作为 varchar 返回。

CREATE FUNCTION GetNewUniqueId
  (@UserId int)
RETURNS varchar(3)
AS
BEGIN
  DECLARE @Count int;

  SELECT @Count = COUNT(*) 
  FROM Contacts 
  WHERE UserId = @UserId;

  SET @Count = @Count + 1;

  RETURN CAST(@Count AS varchar(3));
END

但是,如果您真的想要“视觉上令人愉悦”的东西,为什么不尝试返回更像 的东西Firstname + Lastname呢?

CREATE FUNCTION GetNewUniqueId
  (@UserId int, @FirstName varchar(255), @LastName varchar(255))
RETURNS varchar(515)
AS
BEGIN
  DECLARE @UniqueId varchar(515), @Count int;

  SET @UniqueId = @FirstName + @LastName;

  SELECT @Count = COUNT(*) 
  FROM Contacts 
  WHERE UserId = @UserId AND LEFT(UniqueId, LEN(@UniqueId)) = @UniqueId;

  IF @Count > 0
    SET @UniqueId = @UniqueId + '_' + CAST(@Count + 1 AS varchar(3));

  RETURN @UniqueId;
END
于 2013-04-10T15:55:55.850 回答