我在sql server中有一个订单表,我需要订单号主键是这样的
OR\20160202\01
OR
只是一个字符串
20160202
是日期
01
是当天的序列号
第二个订单记录当天
OR\20160202\02
等等..
也应该包括反冲......
在sql server中创建这样一个字段的方法是什么(使用版本2016)
编辑:要为序列号添加更多上下文,它只是这个字段合成的一种方式或不是唯一的。没有序列号我将在DB中获得重复记录,因为我可以在同一天有很多记录,所以日期将保持不变,因此它会像
OR\20160202
表示该特定日期的所有行,因此它会重复。添加"序列"数字有助于解决这个问题。
答案 0 :(得分:0)
最好的方法是不在SQL中创建这样的列。您有效地将多个数据组合到同一列中,出于多种原因,这不应该发生在关系数据库中。列应该包含一个数据。
而是在所有必要的列上创建复合主键。
答案 1 :(得分:0)
复合pk
订单varchar(20)
orDate DateTime
select *
, row_number() over (partition by cast(orDate as Date) order by orDate) as seq
from table
关于如何连接数据,请留给你 这是介绍的事情 - 不要让它成为PK的问题
答案 2 :(得分:0)
关于"当天的序列号" (部门,年份,国家,......)。 几乎每次我与最终用户讨论这样的要求时,结果都只是误解了共享数据库的工作方式,模糊地尝试在共享数据库上重复旧的(单独的数据库,EXCEL文件甚至文书工作)技巧。 所以我第二次选择Tom H和其他人,首先尝试不要这样做。
如果你必须这样做,出于法律或其他不可思议的原因,我希望你在2012年以上。每天创建SEQUENCE。
答案 3 :(得分:0)
格式化PK不是一个好主意。复合键是一种更好的方法。应该使用day作为日期列和订单号作为bigint列的组合。这有助于提高查询性能。
答案 4 :(得分:0)
您可能想要探索“日期维度”'表。 Date Dimension是数据仓库中常用的表。它存储日历的所有日期(根据您选择的年份)和当前数字生成的密钥。在日期维度上查看此帖子。它讨论了在SQL SERVER中创建一个。