自动递增主键并每月重新播种
Auto increment primary key and reseed every month
创建具有复合主键的 SQL table 的最佳解决方案是什么。
- 主键的第一列是
ID
{int
}。
- 主键的第二列是
YearMonth
{string
像 yyyyMM ex。 201409 } 这是当前月份。
每个月可以将 ID 重新播种为 1
我实际上需要 运行 ID,例如
"201409-00001"
"201409-00002"
"201409-00003"
.
.
"201410-00001"
"201410-00002"
.
.
"201411-00001"
您是否尝试过连接它们并创建一个新列使其成为主键?
不知道有没有更简单的方法,不过这个应该可以:
SELECT CONCAT(YEAR(CURRENT_TIMESTAMP), MONTH(CURRENT_TIMESTAMP),'-',ID)
FROM <TABLE NAME>;
尝试这样的事情:
ALTER TABLE table_name AUTO_INCREMENT = 1
还有这个:
ALTER TABLE foobar_data MODIFY COLUMN col VARCHAR(255) NOT NULL DEFAULT '201409';
和 运行 每个月都会通过某种方法进行此查询 ;)
- 从 1 开始创建序列并将其连接到您的 'year,month'
- 在每个月的第一天创建作业并重新启动序列
根据问题和您的评论,您似乎需要以 201411-00001
格式显示行标识符。这不需要是您实际的主键。我建议你做这样的事情。
用 ID
创建你的 table,这是身份。添加另一列 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)
您也可以有一个触发器,它根据当月的 MAX(monthlyID) + 1
更新新的 INT
列 monthlyID
。
最后,我尝试使用@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
创建具有复合主键的 SQL table 的最佳解决方案是什么。
- 主键的第一列是
ID
{int
}。 - 主键的第二列是
YearMonth
{string
像 yyyyMM ex。 201409 } 这是当前月份。
每个月可以将 ID 重新播种为 1
我实际上需要 运行 ID,例如
"201409-00001"
"201409-00002"
"201409-00003"
.
.
"201410-00001"
"201410-00002"
.
.
"201411-00001"
您是否尝试过连接它们并创建一个新列使其成为主键?
不知道有没有更简单的方法,不过这个应该可以:
SELECT CONCAT(YEAR(CURRENT_TIMESTAMP), MONTH(CURRENT_TIMESTAMP),'-',ID)
FROM <TABLE NAME>;
尝试这样的事情:
ALTER TABLE table_name AUTO_INCREMENT = 1
还有这个:
ALTER TABLE foobar_data MODIFY COLUMN col VARCHAR(255) NOT NULL DEFAULT '201409';
和 运行 每个月都会通过某种方法进行此查询 ;)
- 从 1 开始创建序列并将其连接到您的 'year,month'
- 在每个月的第一天创建作业并重新启动序列
根据问题和您的评论,您似乎需要以 201411-00001
格式显示行标识符。这不需要是您实际的主键。我建议你做这样的事情。
用 ID
创建你的 table,这是身份。添加另一列 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)
您也可以有一个触发器,它根据当月的 MAX(monthlyID) + 1
更新新的 INT
列 monthlyID
。
最后,我尝试使用@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