Sql 删除行后重置列的数字序列
我见过许多在删除一行后重新为标识列设置种子的解决方案。但是,我需要从不是标识列的列中重置数字序列Sql 删除行后重置列的数字序列,sql,sql-server,Sql,Sql Server,我见过许多在删除一行后重新为标识列设置种子的解决方案。但是,我需要从不是标识列的列中重置数字序列 +------+---------+----------+ | group| user | sequence | +------+---------+----------+ | 1 | barney | 1 | | 1 | andy | 2 | | 1 | odis | 3 | | 1 | opie |
+------+---------+----------+
| group| user | sequence |
+------+---------+----------+
| 1 | barney | 1 |
| 1 | andy | 2 |
| 1 | odis | 3 |
| 1 | opie | 4 |
| 2 | beaver | 1 |
| 2 | wally | 2 |
| 2 | eddie | 3 |
+------+---------+----------+
因此,如果我删除ODI,新序列需要如下所示:
+------+---------+----------+
| group| user | sequence |
+------+---------+----------+
| 1 | barney | 1 |
| 1 | andy | 2 |
| 1 | opie | 3 |
| 2 | beaver | 1 |
| 2 | wally | 2 |
| 2 | eddie | 3 |
+------+---------+----------+
当删除发生时,您可以在表的顶部构建一个视图,动态计算序列,而不是重置列值(可能是其中重要的一部分)
在用户名上使用排序(但是这意味着在更新usernmae时序列可能会更改):
或者更好,使用基于原始序列的排序:
CREATE VIEW myview AS
SELECT
group,
user,
ROW_NUMBER() OVER(PARTITION BY group ORDER BY sequence) sequence
FROM mytable t
我希望这能解决您的问题:
with tbl2(grp, usr, seq) as
(
select grp, usr,
row_number() over(partition by grp order by seq) as seq
from tbl1
)
update tbl1
set seq = t2.seq
from tbl1 t1
join tbl2 t2 on t2.grp = t1.grp and t2.usr = t1.usr
where t2.seq != t1.seq
如果它不是一个标识列,那么您当前是如何生成序列的?因此,如果您在插入
opie
后删除odis
,您想为该表重新生成整个序列吗?@DaleBurrell,是的,但我只想为组1重新生成序列。没有函数来执行此操作,因此您必须对其进行编码,也许最好的方法是创建一个触发器来处理删除,这将允许您知道删除了哪条记录并手动重新生成序列。在这种情况下,为什么要麻烦存储序列,而您只需在任何查询中通过按组划分的行数()生成序列。您确定按[用户]排序吗?@Sami:如果我们遵循创建视图的逻辑,我不确定保留原始顺序有多重要。当然,按顺序排序可能会更好。我相应地更新了我的答案。
with tbl2(grp, usr, seq) as
(
select grp, usr,
row_number() over(partition by grp order by seq) as seq
from tbl1
)
update tbl1
set seq = t2.seq
from tbl1 t1
join tbl2 t2 on t2.grp = t1.grp and t2.usr = t1.usr
where t2.seq != t1.seq