sql-server - 是否可以使用复合键:date + int 每天重新开始自动增量?(MSSQL)
问题描述
假设我有一个只有两个字段的小型数据库表。(MSSQL) 像这样:
date (Date) daily_counter (Int)
-------------------------
2021-07-18 0
2021-07-18 1
2021-07-18 2
2021-07-19 0
我想插入新的第五行并将值“2021-07-19”插入日期字段。我想知道我的新行的daily_counter是什么。
正如您可能从示例中理解的那样,daily_counter 应该自动增加,从每天开始。
因此,由于在daily_counter 字段上已经存在该日期的值为0 的行。我想为我的新行添加 1 到 daily_counter 而不将值 1 发送到查询。
在设计这种类型的表格和数据时,我该如何思考。任何提示表示赞赏。谢谢!
古斯塔夫
更新:
好的,我想我有一些可以工作的东西。唯一的缺点是删除和添加新行时,因为新的 id 可以预先使用和删除并再次添加。
我认为我得到了可以使用的东西。
现在可能不漂亮,但它看起来像这样。
当当天没有行时,它似乎也有效。
DECLARE @date DATE
SET @date = '2021-07-22'
DECLARE @daily_counter INT
SET @daily_counter = (SELECT MAX(daily_counter) from mytable where date = @date);
SET @daily_counter = @daily_counter + 1;
IF @daily_counter IS NULL
BEGIN
SET @daily_counter = 1;
END
INSERT INTO
mytable
(date, daily_counter)
OUTPUT @daily_counter
VALUES (@date, @daily_counter)
再次感谢您的帮助!
解决方案
不可能让数据库在行本身中自动执行此操作。您必须在所有日期都有一个计数器(一个SEQUENCE会很好)。
您可以做的是在查询数据时使用该row_number()
函数来模拟这一点:
SELECT *, row_number() over (partition by [date] order by [date])
FROM ...
不幸的是,如果您需要在删除后保留原始位置,这仍然会失败,但是现在在没有触发器或应用程序代码的数据库中没有一个好的方法来执行此操作。
推荐阅读
- c# - 如何使用 WireShark 对从本地计算机发送到 Azure IOT Hub 的消息进行故障排除?
- sql - SQL server 货币代码,如果 Invoice 有一种多一种货币
- dart - 在颤动中为 MapView 设置高度
- angular - 我们将为枚举分配的变量提供什么数据类型?
- ruby-on-rails - Rails 控制器脚手架代码
- javascript - webpack构建react项目,资源文件CORS
- elasticsearch - 可以获得与特定查询匹配的记录的 size_in_bytes 吗?
- javascript - 在 Jquery 中加载动态控件
- angular - 错误 @ionic/app-scripts 是 ionic serve 正常工作所必需的
- php - 如何为路由组添加前缀以及如何在刀片视图中调用子路由