更新多行时MySQL重复条目
我有一个项目表,其中每个项目都有一个itemOrder。itemOrder是主键的一部分。我正试图写一个更新,将重新排序的项目 例如,如果我想将项目3移动为项目1,则项目3的新itemOrder将为1,项目1将为2,项目2将为3。此查询在SQL Server中工作,因为UPDATE语句是事务性的 更新tbl_项目 当itemOrder=3时,设置itemOrder=CASE,然后设置1 ELSE itemOrder+1 END 其中项目顺序介于1和3之间; 在MySQL中,一次更新一行,如果在任何一点上存在重复的PK,就会抛出一个错误。一定有办法解决这个问题,对吧?我试着回答,但没有用。我还尝试将该语句包装到启动事务中/犯罪但它也有同样的错误更新多行时MySQL重复条目,mysql,Mysql,我有一个项目表,其中每个项目都有一个itemOrder。itemOrder是主键的一部分。我正试图写一个更新,将重新排序的项目 例如,如果我想将项目3移动为项目1,则项目3的新itemOrder将为1,项目1将为2,项目2将为3。此查询在SQL Server中工作,因为UPDATE语句是事务性的 更新tbl_项目 当itemOrder=3时,设置itemOrder=CASE,然后设置1 ELSE itemOrder+1 END 其中项目顺序介于1和3之间; 在MySQL中,一次更新一行,如果在任
我猜MySQL解决方案与ON-DUPLICATE KEY有关,但我还不能完全理解它,也无法在我的场景中使用它。默认情况下,MySQL以自动提交模式运行;您需要手动创建事务:
begin;
update ...;
update ...;
commit;
或者,您可以在更新之前关闭自动提交
set autocommit = 0;
并可选择在更新后再次打开:
set autocommit = 1;
这是一个非常粗糙的工作,如果有人有正确的答案,我很乐意将其标记为正确答案,但在此之前,我的解决方案如下 分隔符// 创建过程'sp_move_item` fromOrder INT, toOrder INT 开始 -@shift是每个其他物品需要移动的量,以腾出空间 -对于目标项:-1用于上移,1用于下移 选择@low:=当fromOrder>toOrder,然后从Order END选择toOrder ELSE时的大小写, @高:=当fromOrder
注意:这段代码假设itemOrders是连续的,没有丢失值,尽管我认为即使不是这样,它仍然可以工作。不过,我还没有想清楚,所以您的里程数可能会有所不同。这对我不起作用。我试着用这两种方法开始;并开始交易;,在事务内部和外部设置自动提交。虽然我只使用了一条UPDATE语句来完成所有的行,但我认为这不会有什么不同。