首页 > 解决方案 > 是否可以使用复合键: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)

再次感谢您的帮助!

标签: sql-servercomposite-primary-key

解决方案


不可能让数据库在行本身中自动执行此操作。您必须在所有日期都有一个计数器(一个SEQUENCE会很好)。

您可以做的是在查询数据时使用该row_number()函数来模拟这一点:

SELECT *, row_number() over (partition by [date] order by [date])
FROM ...

不幸的是,如果您需要在删除后保留原始位置,这仍然会失败,但是现在在没有触发器或应用程序代码的数据库中没有一个好的方法来执行此操作。


推荐阅读