SQL Server格式化的标识列

时间:2011-08-09 02:11:48

标签: c# sql sql-server identity-column

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

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

SQL Server可以这样做吗?或者我是否必须使用C#来管理序列?如果是这种情况,我如何使用EntityFramwork获取下一个[标识号]部分?

由于

编辑:

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

  • FOO将是一个常量字符串
  • BAR会有所不同,具体取决于通知的类型(检测,警告或执行)

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

4 个答案:

答案 0 :(得分:3)

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

  1. 在表
  2. 中使用INT IDENTITY字段作为PK
  3. 为此表创建视图。在此视图中,您还可以使用字符串和类型生成所需的字段。
  4. 在您的报道中使用此视图。
  5. 但我仍然认为,DB设计存在很大问题。我希望你会尝试使用规范化进行重新设计。

答案 1 :(得分:1)

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

但IMO我真的认为没有真正的理由以这种方式连接ID并将其存储在数据库中。但是,我真的只使用int作为我的ID。

答案 2 :(得分:0)

另一种选择是使用我曾经使用的旧团队称为代码和值表。我们没有正确地使用它(我们使用它代替自动递增身份以防止某些关键表的环境不匹配),但你可以做的是:

  1. 创建一个表,其中包含每个类别的行。行中的两个(或更多)列 - 类别名称和下一个数字的最小值。
  2. 当您在另一个表中插入记录时,您将运行存储过程以获取该类别的下一个可用标识号,将代码和值表中的数字增加1,并将类别和数字连接在一起为你的插入。
  3. 然而,如果你的主表是一个包含大量插页的高容量表,那么你可能会发现不合时宜的事情。

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

答案 3 :(得分: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。