我希望在表格中有一个主键列,格式为FOO-BAR- [标识号],例如:
FOO-BAR-1
FOO-BAR-2
FOO-BAR-3
FOO-BAR-4
FOO-BAR-5
SQL Server可以这样做吗?或者我是否必须使用C#来管理序列?如果是这种情况,我如何使用EntityFramwork获取下一个[标识号]部分?
由于
编辑:
我需要这样做是因为此列表示发送给客户的通知的唯一标识符。
那么只有一个int标识列并在C#中将值附加到业务逻辑层中会更好吗?
答案 0 :(得分:3)
如果您想在报告中使用此“合成”字段,我建议您:
但我仍然认为,DB设计存在很大问题。我希望你会尝试使用规范化进行重新设计。
答案 1 :(得分:1)
您可以在表格中将任何内容设置为PK。但是在这个例子中,我将IDENTITY
设置为一个自动递增的int,并在SQL,BLL或UI中手动将FOO-BAR附加到它,具体取决于它的使用原因。如果FOO
和BAR
存在业务原因,那么您还应将其设置为数据库行中的值。然后,您可以在两个三列之间的数据库中创建一个键,具体取决于您实际使用这些值的原因。
但IMO我真的认为没有真正的理由以这种方式连接ID并将其存储在数据库中。但是,我真的只使用int
作为我的ID。
答案 2 :(得分:0)
另一种选择是使用我曾经使用的旧团队称为代码和值表。我们没有正确地使用它(我们使用它代替自动递增身份以防止某些关键表的环境不匹配),但你可以做的是:
然而,如果你的主表是一个包含大量插页的高容量表,那么你可能会发现不合时宜的事情。
无论如何,即使它的数量不高,我认为你最好还是要重新审视你为什么要这样做,看看是否还有另一种更好的方法(例如拥有业务层或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。