SQL Server格式化的标识列

本文关键字:标识 格式化 Server SQL | 更新日期: 2023-09-27 18:04:47

我想在一个格式为FOO-BAR-[身份号]的表中有一个主键列,例如:

FOO-BAR-1  
FOO-BAR-2  
FOO-BAR-3  
FOO-BAR-4  
FOO-BAR-5  

SQL Server可以这样做吗?或者我必须使用c#来管理序列吗?如果是这种情况,我如何使用entityframework获得下一个[身份号码]部分?

感谢编辑:

我需要这样做是因为这一列表示发送给客户的通知的唯一标识符。

  • FOO将是一个常量字符串
  • BAR将根据通知的类型(检测、警告或强制执行)而有所不同

所以它是更好的只有一个int标识列和附加值在业务逻辑层在c# ?

SQL Server格式化的标识列

如果你想在你的报告中使用这个' compositing '字段,我建议你:

  1. 使用INT IDENTITY字段作为表
  2. 中的PK
  3. 为该表创建视图。在此视图中,您还可以使用字符串和类型生成所需的字段。
  4. 在报告中使用此视图。

但我仍然认为,数据库设计有很大的问题。我希望您尝试使用规范化重新设计。

可以将任何内容设置为表中的PK。但在这种情况下,我将IDENTITY设置为一个自动递增的int,并在SQL, BLL或UI中手动添加FOO-BAR-,这取决于它被使用的原因。如果FOOBAR有业务原因,那么您也应该将它们设置为DB行中的值。然后,您可以根据实际使用这些值的原因在DB中创建两个三列之间的键。

但在我看来,我真的不认为有一个真正的理由,以这种方式连接一个ID,并将其存储在数据库中。但再一次,我真的只使用int作为我的ID。

另一个选择是使用我曾经所在的一个老团队所称的代码和值表。我们并没有将其用于此目的(我们使用它来代替自动递增标识,以防止某些键表的环境不匹配),但是您可以这样做:

  1. 创建一个表,其中每个类别有一行。行中两(或更多)列-类别名称和下一个数字的最小值。
  2. 当您在另一个表中插入一条记录时,您将运行一个存储过程以获取该类别的下一个可用标识号,将代码和值表中的数字增加1,并将类别和编号连接在一起以进行插入。

然而,如果你的主表是一个大容量的表,有很多插入,你可能会结束的东西没有顺序。

在任何情况下,即使不是很大的量,我认为你最好重新审视一下你为什么要这样做,看看是否有其他更好的方法(比如让业务层或UI来做,就像其他人建议的那样)。

像这样使用计算列是完全可能的:

CREATE TABLE #test (
    id INT IDENTITY UNIQUE CLUSTERED,
    pk AS CONCAT('FOO-BAR-', id) PERSISTED PRIMARY KEY NONCLUSTERED,
    name NVARCHAR(20)
)
INSERT INTO #test (name) VALUES (N'one'), (N'two'), (N'three')
SELECT id, pk, name FROM #test
DROP TABLE #test

注意,pk被故意设置为NONCLUSTERED,因为它是VARCHAR类型,而IDENTITY字段(无论如何都是唯一的)被设置为unique CLUSTERED。