使用字符串值作为主键

Using String values for primary key

我可以将 SOF/2015/01 存储为我的 ID,我可以像通常的主键一样自动递增 01 吗?

Can I store SOF/2015/01 as my ID

回答:可以

can I auto increment 01 like usual primary key.

答案:不,你不能

自动递增只能递增数字。

您必须手动执行此操作。

您可以在触发器中使用函数来生成您想要的自动递增数字,如下所示

create function NextCustomerNumber() 
returns char(5) 
as 
begin 
    declare @lastval char(5) 
    set @lastval = (select max(customerNumber) from Customers) 
    if @lastval is null set @lastval = 'C0001' 
    declare @i int 
    set @i = right(@lastval,4) + 1 
    return 'C' + right('000' + convert(varchar(10),@i),4) 
end

这可能会导致一些问题,但是:

  • 如果两个进程试图向 table 添加一行 同时?您能否确保不会为以下内容生成相同的值 两个进程?
  • 每次您都需要查询现有数据时可能会产生开销 插入新数据
  • 除非这是作为触发器实现的,否则这意味着所有插入 您的数据必须始终通过相同的存储过程 计算这些序列。这意味着批量进口或移动 从生产到测试等的数据,可能是不可能的或 可能效率很低。
  • 如果它作为触发器实现,它是否适用于基于集合的 多行 INSERT 语句?如果是这样,效率如何?这个 如果为单个基于集合的每一行调用函数将不起作用 INSERT -- 返回的每个 NextCustomerNumber() 都是相同的值。

您可以从 this

了解更多

你当然可以使用 NCHARNVARCHAR 类型作为主键,前提是任何可变大小的列不使用 MAX,并且数据不超过索引的最大允许大小。

至于将其用作自增列,那是行不通的。 SQL 非常聪明,但不是那么聪明。

我建议将该字符串分成两列或三列,这样您就可以将 "01" 部分存储为单独的 IDENTITY 列。但肯定这是一个设计问题,您必须自己解决。

另一个解决方案是触发器,但我通常会犹豫是否使用类似这样的东西作为主键。使用数字类型在很多方面都更好,特别是当您必须在别处引用表格时。您总是可以在字符串表示上应用 UNIQUE 索引。

创建一个双列唯一主键,其中字符串 'SOF/2015' 作为第一部分,自动递增整数作为第二列。您可以使用 returns 一个字符串的函数来组合这两列,从而为您提供组合键。对于语法糖,您可以在 table 上创建一个视图,使用您的函数将键组合到一个视图列中。