【问题标题】:reverting alpha numeric identity恢复字母数字身份
【发布时间】:2016-02-24 14:42:48
【问题描述】:

我看到这个问题已经被问过很多次了,结果都很好,但是这个问题的不同之处在于,我们希望在添加字母数字 ID 后恢复为正常的自动增量 ID。

我们有 3 个数据库,它们最终将全部合并为一个数据库。为了让我们的系统保持合规性,我们需要 ID 在合并过程中保持不变。到目前为止,我们已经成功地将数据以字母数字方式组合在一起,在记录 ID 前面加上数据库源,例如来自 DBAA 的 ID 现在是 AA##,而 DBBB 现在是 BB##。

现在的问题是,是否可以在不添加更多列或在后端创建函数的情况下将 varchar ID 列恢复为自动递增整数?这个想法是新合并 DB 中的下一个条目将比 3 个 DB 中的最高值高一个,因此如果 AA10 最高,则下一个条目将是 11。(没有前缀,后端没有函数)

CREATE TABLE tableTest
(
    colID varchar(50) PRIMARY KEY,
    [desc] varchar(10) NOT NULL
)   
ALTER TABLE tableTest ALTER COLUMN colID int NOT NULL IDENTITY(1,1)

当然,你可以想象那行不通。最终我只想知道这是否可以在没有后端函数或附加列的情况下实现。

【问题讨论】:

  • 想一想。您有像 AA14 这样的值,并且您想将列更改为 int。那永远行不通。您所描述的是两条信息,一个数据源和一个数值。不要将这两条信息强行放在一个列中。这违反了 1NF 并导致无数的痛苦。相反,创建两列,每条信息各一列。
  • 另外,如果没记错的话,您不能将现有列更改为标识列
  • @ZoharPeled 是正确的,我应该在前面提到它。还有很多其他的逻辑问题,我什至没有考虑过这种微妙之处。 :)
  • 我意识到这不是解决这个问题的最佳方法,但我为一家真正希望这样做的公司工作。我已经设法将 ID 字段重做为 varchar,以便它处理 alpha 部分,我们可以制作它,所以下一个值就是我们正在寻找的,棘手的部分是在没有额外功能的情况下实现它。直接说吧,这可能吗?也许如果你有其他的想法也很棒:)

标签: sql-server identity alphanumeric


【解决方案1】:

所以,总结一下 Sean 和我的 cmets - 答案是否定的。
由于许多原因,这是不可能的。

您可以操作该列中的数据以创建唯一的数值(即提供您的值现在是唯一的)- 这样就可以解决问题:

UPDATE tableTest
    SET colId = REPLACE(REPLACE(REPLACE(colId, 'AA', ''), 'BB', ''), 'CC', '') + 
    CASE 
        WHEN colId LIKE 'AA%' THEN '1'
        WHEN colId LIKE 'BB%' THEN '2'
        WHEN colId LIKE 'CC%' THEN '3'
    END

这样,您当前的数字部分将保留最高有效数字 - 因此,如果您的表包含像
. AA1, BB5, CC7, AA30, BB12 这样的值,它现在将包含以下值:
. 11, 52, 73, 301, 122 - 如您所见,“订单”被保留。

另一种选择是添加一个新的标识列,删除当前的colID 列,并将标识列重命名为colID
这可以通过使用 ssms 的表格设计器或使用 sp_rename 来实现。
请注意,如果您不使用表设计器,则必须先删除主键约束,然后才能删除列。

【讨论】:

  • 是的,数据一开始是唯一的,当然,如果您合并 3 个表,它将不再是唯一的,尽管您在那里所做的事情确实有意义并且应该没有问题。目标是保留 ID,因此创建一种新的 colID 会违背目的。除非旧 ID 也保存在自己的列中。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-19
  • 2014-08-14
  • 1970-01-01
  • 2017-10-31
  • 2014-02-19
  • 2015-07-02
  • 2013-11-26
相关资源
最近更新 更多