当前位置: 首页 > 面试题库 >

如何创建由其他列细分的自动递增列

曾山
2023-03-14
问题内容

我需要创建一个包含增量ID的表,但是我希望这些ID根据另一列自动进行细分。这是我想要的:

CREATE TABLE dbo.MyTable (
    myKey INT IDENTITY PRIMARY KEY,
    category INT,
    incrementalId INT
);

INSERT INTO dbo.MyTable (category) VALUES (100);
INSERT INTO dbo.MyTable (category) VALUES (200);
INSERT INTO dbo.MyTable (category) VALUES (100);
INSERT INTO dbo.MyTable (category) VALUES (100);
INSERT INTO dbo.MyTable (category) VALUES (100);
INSERT INTO dbo.MyTable (category) VALUES (200);

SELECT *
FROM dbo.MyTable;

我想要显示类似以下内容:

myKey       category    incrementalId
----------- ----------- -------------
1           100         1
2           200         1
3           100         2
4           100         3
5           100         4
6           200         2

意思是我希望incrementalId每个类别自动递增,并为插入的任何新类别从1重新开始。我希望在表中的任何插入处自己完成此操作(我不想在插入此表时记得这样做)。

我认为这可以通过窗口函数或触发器来完成,但我不知道如何做到。

编辑:

我希望数据能够持久保存,以避免在发生数据删除时对增量ID进行移位。另外,理想情况下,在删除行的情况下,不会重新赋予相同的ID(与序列或IDENTITY的工作方式相同)

任何的想法 ?


问题答案:
CREATE TABLE dbo.MyTable (
  myKey INT IDENTITY PRIMARY KEY,
  category INT,
  incrementalId INT
);
GO

create table dbo.nextCategoryID (
  category int,
  nextidvalue int,
  constraint PK_nextCategoryID primary key clustered( category, nextidvalue )
);
GO

create trigger numberByCategory on dbo.MyTable
after insert as

-- Automatically add any net new category
insert into dbo.nextCategoryID ( category, nextidvalue )
    select distinct category, 1 as nextidvalue
    from inserted
    where not exists ( select * from dbo.nextCategoryID s
        where s.category = inserted.category );


-- Number the new rows in each incoming category
with numberedrows as (
    select 
        i.myKey, 
        i.category, 
        n.nextidvalue - 1 + row_number() over ( partition by i.category order by i.category ) as incrementalId
    from inserted i
    join dbo.nextCategoryID n on i.category = n.category
)
update m
    set incrementalId = n.incrementalId
from dbo.MyTable m
join inserted i on m.myKey = i.myKey
join numberedrows n on n.myKey = i.myKey;


update dbo.nextCategoryID
    set nextidvalue = 1 + ( select max( m.incrementalId ) 
        from inserted i 
        join dbo.MyTable m on i.myKey = m.myKey
        where i.category = nextCategoryID.category 
    )
where exists ( select * 
    from inserted i
    where i.category = nextCategoryID.category
);

GO

-- Test data

INSERT INTO dbo.MyTable (category) VALUES (100);
INSERT INTO dbo.MyTable (category) VALUES (200);
INSERT INTO dbo.MyTable (category) VALUES (100);
INSERT INTO dbo.MyTable (category) VALUES (100);
INSERT INTO dbo.MyTable (category) VALUES (100);
INSERT INTO dbo.MyTable (category) VALUES (200);

insert into dbo.MyTable (category) 
values 
    ( 200 ),
    ( 200 ),
    ( 100 ),
    ( 300 ),
    ( 400 ),
    ( 400 )


SELECT *
FROM dbo.MyTable;


 类似资料:
  • 问题内容: 我有一个从中创建视图的MySQL数据库。是否可以为视图中的每一行添加一个自动递增的ID? 我试过了 但这在视图中不起作用。 问题答案: 抱歉-您无法在VIEW中自动递增(不过您可以在存储过程中执行此操作)。 从MySQL手册: 视图定义受以下限制:SELECT语句不能引用系统或用户变量。

  • 我目前正在从事一个由主服务器和许多客户端组成的Laravel4项目。客户端创建数据并将其发送到主服务器。为了避免冲突,我使用UUIDV4作为主键。 但是,一旦在服务器上创建了数据,我希望分配一个唯一的自动递增整数,以便用户更容易识别数据。例如:用户不必谈论而可以谈论 为了保持应用程序的可管理性,我正在使用迁移,此表的当前迁移如下所示: 问题是,Laravel在定义自动增量时自动创建主键,因此迁移最

  • 问题内容: 我正在为购物车制作模型,我需要创建一个在下订单时自动递增的字段: 如何使自动递增? 问题答案: 在Django中 1:我们具有名称为“ id”的默认字段,该字段为自动递增。 2:您可以使用 字段定义自动递增 字段。 如果要使用django的默认ID作为增量字段。 数据库设计

  • 我试图使一个函数,对于一个整数序列作为一个数组,可以确定是否可以通过从数组中移除不超过一个元素来获得严格递增的序列。如果可以移除某个元素,则输出为True,否则返回false。我试过了, 它适用于列表, 因为你不能删除任何会导致递增序列的数字。但是,如果列表是 这是真的,因为你可以删除2或3有一个递增的序列。但是,我的函数错误地输出False。

  • 问题内容: 我正在尝试运行查询以检查列是否自动增加。我可以检查类型,默认值,是否可以为空等,但是我不知道如何测试它是否自动递增。这是我测试其他内容的方式: 不幸的是,没有可比较的列。那么,如何测试列是否自动递增? 问题答案: 对于MySql,请检查以下列: 对于Sql Server,请使用和列:

  • 问题内容: 我的架构看起来像这样: 我已经在同一数据库中创建了counters集合,并添加了一个带有’entityId’的_id的页面。从这里我不确定如何使用猫鼬来更新该页面并获取递增编号。 没有计数器的架构,我希望它保持这种状态,因为这实际上不是应用程序使用的实体。仅应在模式中使用它来自动递增字段。 问题答案: 这是一个示例,如何在Mongoose中实现自动增量字段: