gpt4 book ai didi

c# - 主键列的就地重新排序

转载 作者:行者123 更新时间:2023-11-30 15:44:43 29 4
gpt4 key购买 nike

我有一个包含复合主键的表:

table MyTable 
(
some_id smallint not null,
order_seq smallint not null,
--other columns
)

...其中 some_idorder_seq 组成复合主键。 order_seq 列用于确定我的 C# 3.5/ASP.NET 应用程序其他部分的显示顺序。

我正在设置一个管理页面,用户可以在其中随机排列这些行,一次更改多行的 order_seq 值:

screenshot

屏幕上的所有项目都具有相同的 some_id 当用户点击提交时,新的 order_seq 值应该被保存到数据库。

我的问题是 order_seq 是 PK 的一部分,因此将这些东西混在一起的任务变得很复杂。由于 some_id 是相同的,所以除了 order_seq 本身,我无法识别它们,它会随着我的进行而变化。此外,我必须确保 order_seq 值保持唯一(可能具有某种临时值)。

我最好的想法是使用某种内存集合来跟踪我到目前为止所做的更改。不过,我在实现它时遇到了麻烦。如何一次对多行进行就地重新排序?我可以使用 C# 或基于 SQL 的解决方案。

编辑:不幸的是,我对表设计的控制为零,并且对数据库的一般控制有限。我将无法更改 PK 方案或引入任何新列。

最佳答案

如果可能的话,引入代理主键会减轻很多压力。由于您可以在不更改任何其他字段的情况下更改 order_seq,因此它并不适合作为主键的一部分(您记录中的所有其他字段应直接依赖于主键)。但即使超出了理论范围,您也已经发现了这种复合键的技术问题。

如果您确实需要保持结构不变,那么更改关键字段将会很乏味,而且正如您已经知道的那样,需要一些临时值。在我的脑海中,如果我必须完成这个,我会分两步完成:

UPDATE Table SET order_seq = @newval + BIG_OFFSET WHERE order_seq = @oldval

UPDATE Table SET order_seq = order_seq - BIG_OFFSET WHERE order_seq > BIG_OFFSET

显然,对每个正在更改的不同行运行第一个语句,然后在最后运行第二个语句以重置它们的值。这应该可以防止您在过程中的任何时候拥有重复的主键。

关于c# - 主键列的就地重新排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5875337/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com