从索引中删除元素时,键“INDEX”的重复条目“1-1110”

Posted

技术标签:

【中文标题】从索引中删除元素时,键“INDEX”的重复条目“1-1110”【英文标题】:Duplicate entry '1-1110' for key 'INDEX' while removing element from Index 【发布时间】:2019-10-05 04:04:39 【问题描述】:

如果在两者之间添加了一些东西,我有一个更新索引的查询

update My_Table
     set NS_LEFT = NS_LEFT + 10
     where NS_THREAD = parentThread and NS_LEFT > oldRight
     order by NS_LEFT desc

它工作正常 -

现在,如果我必须在两者之间删除某些内容,那么我将使用如下查询

update My_Table
    set NS_LEFT = NS_LEFT - 10
    where NS_THREAD = parentThread and NS_LEFT > oldRight
    order by NS_LEFT desc

它不工作并抛出重复索引的错误 -

[代码:1062,SQL 状态:23000] (conn=1517) 重复条目 '1-1110' 对于键“索引”

索引(NS_THREAD,NS_LEFT)

如何解决删除元素

注意 这是我为 MariaDB 解决的问题,仅适用于其他其他数据库,它在没有 OrderBy 的情况下工作(为什么.. 它对我来说仍然是悬而未决的问题)

【问题讨论】:

也许您需要 order by 才能在第二个查询中成为 ASC;如果您保留 DESC,则在为它们创建“空格”之前,最高的数字会被向下移动。 @Uueerdo 我试过了,但它再次显示 ASC 顺序中的重复键错误 您是先执行删除操作吗? 是的,我们先删除 @Uueerdo 有什么线索吗?? 【参考方案1】:

我过去在无法控制订单时所做的就是执行两次更新。第一个将组向上移动超过任何当前使用的值,以确保没有冲突。第二个然后将它们转移到它们应该在的位置。一般来说,这个想法可以用这样的方式来说明:

UPDATE aTable SET somevalue = somevalue + 10000 WHERE somevalue > x;
UPDATE aTable SET somevalue = somevalue - 10000 - y WHERE somevalue > x + 10000;

"10000" 只是一个将范围推过碰撞的值,y 是您实际想要移动它们的量。显然,如果已经有 10000 左右的值,则该数字需要有所不同。为了避免必须查询安全值,如果设计允许,另一种选择......

如果不使用负值并且表格设计允许负数,则此版本的流程更易于应用:

UPDATE aTable SET somevalue = somevalue * -1 WHERE somevalue > x;
UPDATE aTable SET somevalue = (somevalue * -1) - y WHERE somevalue < 0; 

这假定通常不存在负值,并且为了安全起见,更新应该在事务中执行(与原始删除一起),这样该解决方案的潜在并发应用程序就不会发生冲突。 (编辑:请注意,事务/并发要求适用于我提出的两种形式。)

编辑:哦,我刚刚注意到 Gordon 的回答非常相似......裸露的减号看起来像我屏幕上的斑点。如果 Gordon's 不起作用,这也不会。

【讨论】:

谢谢 ....这对我有用,在我的第一个示例中增加 NS_LEFT 时我有一个疑问,使用 order by 是否正确?如果没有,那么我可以对您提供的答案做同样的事情吗? 我认为第二次更新应该是UPDATE aTable SET somevalue = somevalue - 10000 - y WHERE somevalue + 10000 &gt;= x; WHERE 子句中更改了somevalue + 10000 &gt;= x 以确保查询只选择“防碰撞范围​​”..跨度> @RaymondNijland 我认为你的意思是某个值 > x + 10000;但是由于第一次更新首先将 x 以上的所有内容都移动了,因此除非没有处理并发(通过事务或其他地方),否则移动的项目和 x 之间不应存在任何内容。【参考方案2】:

会发生这种情况。一种解决方案是进行两次更新:

update My_Table
    set NS_LEFT = - (NS_LEFT - 10)
    where NS_THREAD = parentThread and NS_LEFT > oldRight
    order by NS_LEFT desc;

update My_Table
    set NS_LEFT = - NS_LEFT
    where NS_THREAD = parentThread and NS_LEFT < 0;

【讨论】:

为什么是2,你能解释一下吗? 第一个查询运行良好,但第二个查询再次运行 - [代码:1062,SQL 状态:23000] (conn=1517) 键 'INDEX' 的重复条目 '1-1116' @Afgan 。 . .在这种情况下,您的逻辑似乎是错误的。您在不应该有它们的列中创建重复项。 为什么我们不能在添加元素时使用 single as,这是我为 MariaDB 解决的问题,仅适用于其他其他数据库,它在没有 OrderBy 的情况下工作(为什么..它对我来说仍然是悬而未决的问题)

以上是关于从索引中删除元素时,键“INDEX”的重复条目“1-1110”的主要内容,如果未能解决你的问题,请参考以下文章

如何通过键删除 lua 表条目?

CREATE UNIQUE INDEX 终止,因为发现了索引 ID 1 的重复键。最重要的主键为 'type 6c, len 9'。如何处理?

列表中的索引元素[重复]

python如何有多个重复元素删除其中一个?

为啥带有单个条目的python列表为-1索引和0索引提供第0个元素? [复制]

LeetCode ( 26 ) ---[删除有序数组中的重复项](Java)