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# ?
如果你想在你的报告中使用这个' compositing '字段,我建议你:
- 使用INT IDENTITY字段作为表 中的PK
- 为该表创建视图。在此视图中,您还可以使用字符串和类型生成所需的字段。
- 在报告中使用此视图。
但我仍然认为,数据库设计有很大的问题。我希望您尝试使用规范化重新设计。
可以将任何内容设置为表中的PK。但在这种情况下,我将IDENTITY
设置为一个自动递增的int,并在SQL, BLL或UI中手动添加FOO-BAR-,这取决于它被使用的原因。如果FOO
和BAR
有业务原因,那么您也应该将它们设置为DB行中的值。然后,您可以根据实际使用这些值的原因在DB中创建两个三列之间的键。
但在我看来,我真的不认为有一个真正的理由,以这种方式连接一个ID,并将其存储在数据库中。但再一次,我真的只使用int
作为我的ID。
另一个选择是使用我曾经所在的一个老团队所称的代码和值表。我们并没有将其用于此目的(我们使用它来代替自动递增标识,以防止某些键表的环境不匹配),但是您可以这样做:
- 创建一个表,其中每个类别有一行。行中两(或更多)列-类别名称和下一个数字的最小值。
- 当您在另一个表中插入一条记录时,您将运行一个存储过程以获取该类别的下一个可用标识号,将代码和值表中的数字增加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。