【问题标题】:Auto create alpha numeric column - SQL Server自动创建字母数字列 - SQL Server
【发布时间】:2021-02-08 03:50:18
【问题描述】:

是否可以在主键列中自动生成特定的字母数字数据?该列的最大长度为 2 个字符。

表格如下所示:

id
----
4S
33
J6
US

我正在寻找一个存储过程来插入一个随机的 2 个字母数字字符值。这在 SQL Server 中可行吗?

我需要使用类似的组合自动生成它

id like '[A-Z][0-9]') 
  or (id like '[A-Z][A-Z]' )
  or (id like '[0-9][0-9]' )
  or (id like '[0-9][A-Z]' )

【问题讨论】:

  • 请提供样本数据和预期结果
  • 上表是我目前的数据
  • 如果有 36 个可能的字符且最大长度为 2,那么在您获得 PK 违规之前最多只能给出 1,296 个可能的值
  • @RyanGadsdon:Martin Smith 指出的是,使用这种技术,您的表中的行数不能超过 1296 行。你确定你可以接受这个限制吗?
  • 这感觉就像XY Problem。至少,您最好使用SEQUENCE 并将数字转换为“密钥”,1'01'10'0A'1296'ZZ'。当然,正如@MartinSmith 所说,这会将您的表限制为 1,296 行;我怀疑这是不希望的。

标签: sql sql-server


【解决方案1】:

别这样。

主键是内部行标识符,不应该是性感或好看的。它们的目的是唯一标识行,仅此而已。

如果您需要一个具有某种格式的密钥,这意味着您可能希望在某处公开它,在用户界面中或通过 API;主键不适合公开。

现在,如果您需要公开一个密钥,那么您可以创建一个辅助密钥。这可能是一个额外的列,可能是一个自动生成的虚拟列,或者它可以使用触发器填充。

【讨论】:

    【解决方案2】:

    其实你有2个问题:

    1. 唯一随机数

    您可以在这里找到答案:Generate list of new unique random numbers in T-SQL

    1. 将常规 (base10) 数字转换为 Base36 ('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ')

    对于 2 个字符长度,您可以使用此代码:

    DECLARE @Base10ToBase36 AS TABLE (
        ID      TINYINT NOT NULL IDENTITY(0,1) PRIMARY KEY,
        Symbol  CHAR(1) NOT NULL CHECK(Symbol LIKE '[0-9,A-Z]')
    )
    
    INSERT INTO @Base10ToBase36(Symbol)
    VALUES  ('0'), ('1'), ('2'), ('3'), ('4'), ('5'), ('6'), ('7'), ('8'), ('9'), 
            ('A'), ('B'), ('C'), ('D'), ('E'), ('F'), ('G'), ('H'), ('I'), ('J'),
            ('K'), ('L'), ('M'), ('N'), ('O'), ('P'), ('Q'), ('R'), ('S'), ('T'),
            ('U'), ('V'), ('W'), ('X'), ('Y'), ('Z')
    
    SELECT  TOP (1) 
            pos1.ID * 36 + pos0.ID AS Base10Number,
            pos1.Symbol,
            Pos0.Symbol,
            CONCAT(pos1.Symbol, Pos0.Symbol) AS Base36
    FROM    @Base10ToBase36 AS pos0
            CROSS JOIN @Base10ToBase36 AS pos1
    ORDER BY NEWID()    -- random
    

    关于随机你可以在这里得到更多的解释:Random record from a database table (T-SQL)

    关于主键 - 我完全同意@TheImpaler。这是个坏主意

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-16
      • 2015-07-13
      • 2015-08-25
      • 2015-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多