自动增加主键并每月重新设定

时间:2015-04-27 10:22:16

标签: sql sql-server identity

创建具有复合主键的SQL表的最佳解决方案是什么。

  • 主键的第一列是ID {int}。
  • 主键的第二列是YearMonth {string,例如yyyyMM ex。 201409}这是当月。

可以每月将ID重新设置为1

我实际上需要像

这样的运行ID
"201409-00001"  
"201409-00002"   
"201409-00003"  
.  
.  
"201410-00001"   
"201410-00002"   
.  
.   
"201411-00001"      

5 个答案:

答案 0 :(得分:3)

根据问题和您的评论,您似乎需要以201411-00001格式显示行标识符。这不一定是您的实际主键。我建议您做这样的事情。

使用ID创建表格,即Identity。添加另一列YearMonth CHAR(6)列,其中存储YYYYMM,或者如果您已经有一个列将日期存储为date/datetime,请使用该列。在你的SELECTs,你会做这样的事情

LEFT(CONVERT(VARCHAR(10),YearMonth,112),6) + '-' + RIGHT(REPLICATE('0',5) + CONVERT(VARCHAR(5),ROW_NUMBER() OVER(PARTITION BY DateCol, ORDER BY ID),5)

您可以选择使用触发器根据当月的INT更新新的monthlyIDMAX(monthlyID) + 1

答案 1 :(得分:0)

您是否尝试连接它们并创建新列以使其成为主键?

不知道是否有更简单的方法,但这应该有效:

SELECT CONCAT(YEAR(CURRENT_TIMESTAMP), MONTH(CURRENT_TIMESTAMP),'-',ID) 
FROM <TABLE NAME>;

答案 2 :(得分:0)

  1. 创建序列从1开始并将其连接到“年,月”
  2. 每月1日创建工作并重新启动序列

答案 3 :(得分:0)

最后,我尝试使用@ughai先生的概念 我使用下面的查询将值保存在另一列上,以表示相对于月份的ID。

select LEFT(CONVERT(VARCHAR(10),YearMonth,112),6) + '-' + RIGHT(REPLICATE('0',4) + CONVERT(VARCHAR(5),ROW_NUMBER() OVER(PARTITION BY LEFT(CONVERT(VARCHAR(10),YearMonth,112),6) ORDER BY ID)),5)  from TestTable

答案 4 :(得分:-1)

尝试这样的事情:

 ALTER TABLE table_name AUTO_INCREMENT = 1

和此:

ALTER TABLE foobar_data MODIFY COLUMN col VARCHAR(255) NOT NULL DEFAULT '201409';

每月通过某种方法运行此查询;)