使用主键的字符串值

时间:2015-02-25 04:49:46

标签: c# sql-server-2008

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

3 个答案:

答案 0 :(得分:2)

  

我可以将SOF / 2015/01存储为我的ID

答案:是的,你可以

  

我可以像通常的主键一样自动递增01。

答案:不,你不能

自动增量只能增加数字。

你必须手动。

您可以使用触发功能生成您想要的自动递增数字

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

然而,这可能会导致一些问题:

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

您可以从this

了解更多信息

答案 1 :(得分:1)

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

答案 2 :(得分:0)

您可以使用NCHARNVARCHAR类型作为主键,假设任何可变大小的列都不使用MAX,并且数据不会使用"01"。 t超过索引的最大允许大小。

至于使用它作为自动增量列,它不会起作用。 SQL很聪明,但不是那么的。

我建议将该字符串拖放到两个或三个单独的列中,以便您可以将IDENTITY部分存储为单独的UNIQUE' d列。但肯定这是一个你必须自己解决的设计问题。

另一个解决方案将是一个触发器,但我可能会犹豫是否使用这样的东西作为主键。使用数字类型在很多方面都要好得多,尤其是当您必须在其他地方引用表时。您始终可以在字符串表示中应用{{1}}索引。