【发布时间】:2020-03-16 15:45:48
【问题描述】:
我有一个Varchar(9) 列,它有一个代码来识别特定情况,它与主键 ID 不同,因为这个是经过一些验证后创建的,而且代码不是按顺序创建的,我们可以有一个案例昨天在 6 点创建,另一个在 8 点创建,另一个在 8 点创建的代码将比另一个先创建。好吧,问题是每个代码都应该是最后一个代码+1,这并不难,但是因为它包含非数字值,所以我们必须检索最大值,但效率不高。
例如:
ID Code
1 AA0008-BX
2 AA0010-BX
3 AA0011-BX
4 AA0009-BX
所以在这种情况下,我必须遍历这 4 个值,检索 'AA0011-BX' 作为最大值,在数字部分添加 1 以使其成为 'AA0012-BX',另外,我有添加使其成为数字字符所需的零的数量。因为它最后有 AA 和 -BX 部分,我们可以使用 max(Code) 并检索最大的,但这是一个包含数千条记录的表并且速度很慢,我想知道什么是最好的选择。
您将如何使用代码来实现这一点以使其真正快速? TIA
【问题讨论】:
-
对每种类型的代码使用一个序列
-
“我们必须检索最大值,但它不是很有效”并且很可能也不正确,除非您在该操作期间完全阻止对表的写入跨度>
-
强制性架构相关评论:如果这可能再次发生,您可能需要重新考虑架构,并将
Code的组件存储在单独的列中,Code作为计算列基于零件的值。 -
@a_horse_with_no_name 我们使用 Microsoft SQL Server,我知道如果两个人同时使用它或者如果有人也在添加新记录,那么总是检索最大数量的麻烦,如果可以的话帮助,这会很棒,我们有一些限制它的方法,但不是在数据库本身。
-
格式是否总是 2 个字母、4 个数字、一个破折号,然后是 2 个字母?
标签: sql sql-server azure