0

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

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

SQL Server 可以做到这一点吗?还是我必须使用 C# 来管理序列?如果是这种情况,我怎样才能使用 EntityFramwork 获得下一个 [identity number] 部分?

谢谢

编辑:

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

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

那么只有一个 int 标识列并在 C# 的业务逻辑层中附加值会更好吗?

4

4 回答 4

3

如果您希望在报告中使用此“合成”字段,我建议您:

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

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

于 2011-08-09T02:29:54.733 回答
1

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

但是IMO我真的认为没有真正的理由以这种方式连接ID并将其存储在数据库中。但话又说回来,我真的只用一个int作为我的身份证。

于 2011-08-09T02:21:30.957 回答
0

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

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

但是,如果您的主表是一个包含大量插入的大容量表,那么您可能会遇到乱序的内容。

无论如何,即使它不是高容量,我认为你最好重新审视你为什么要这样做,看看是否有另一种更好的方法来做到这一点(比如让业务层或 UI 来做) ,正如其他人所建议的那样)。

于 2011-08-09T02:27:35.167 回答
0

使用这样的计算列是很有可能的:

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。

于 2016-07-06T12:35:53.543 回答