从索引中删除元素时,键“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 >= x;
WHERE 子句中更改了somevalue + 10000 >= 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”的主要内容,如果未能解决你的问题,请参考以下文章
CREATE UNIQUE INDEX 终止,因为发现了索引 ID 1 的重复键。最重要的主键为 'type 6c, len 9'。如何处理?