【问题标题】:Using String values for primary key使用字符串值作为主键
【发布时间】:2015-02-25 04:49:45
【问题描述】:

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

【问题讨论】:

  • 请访问here获取解决方案。

标签: c# sql-server-2008


【解决方案1】:

我可以将 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了解更多信息

【讨论】:

  • set @i = right(@lastval,4) + 1 return 'C' + right('000' + convert(varchar(10),@i),4) 这是指什么。 .你能用c#代码解释一下吗
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    至于将其用作自动递增的列,那是行不通的。 SQL 非常聪明,但并不完全如此。

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

    另一种解决方案是触发器,但我通常会犹豫是否使用这样的东西作为主键。使用数字类型在许多方面都好得多,尤其是当您必须在其他地方引用表格时。您始终可以在字符串表示上应用 UNIQUE 索引。

    【讨论】:

    • 在你的情况下,如果我为此课程使用多个列 - SOF ID - 01
    猜你喜欢
    • 1970-01-01
    • 2011-05-04
    • 2020-03-16
    • 2021-03-09
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多