gpt4 book ai didi

MySQL 在一个原子操作中更新两行

转载 作者:太空宇宙 更新时间:2023-11-03 11:47:29 25 4
gpt4 key购买 nike

我有一个表 ID、一个 PK ID 和一个带有一些文本的 varchar(20)。那个PK也是另一个表中的FK我正在尝试在两行之间切换 ID,但我一直无法这样做,因为 MySQl 阻止了这种情况,并且 FK 约束出现原子性错误,该行将违反 FK 约束,但只会持续一毫秒,因为我会使该 ID 与另一行再次存在。例如

表一

ID varchar(10)
1 "Hello"
2 "Bye"

表2

1(PK,FK) "Another data"
2(PK,FK) "BLA"

如果我这样做

UPDATE Table 1 set ID=1 where text="Bye";
UPDATE Table 1 set ID=2 where text="Hello";

它将失败为

  1. ID已经存在
  2. 这将违反 FK 约束。

我该怎么做?

编辑:我必须这样做一次,但对于一堆行,因为有人没有添加一些需要在特定索引中的数据。使用中间值将固定为 1,但仍会违反 FK 约束。发布的答案没有谈论 FK。

最佳答案

您可以尝试交换 `Table 1` 的文本内容,这会产生与交换它们的 ID 相同的效果。如下图

START TRANSACTION;
SET @text1 := 'Hello', @text2 := 'Bye';
SELECT @id1 := ID FROM `Table 1` WHERE text=@text1;
SELECT @id2 := ID FROM `Table 1` WHERE text=@text2;
UPDATE `Table 1` SET text=@text1 WHERE ID = @id2;
UPDATE `Table 1` SET text=@text2 WHERE ID = @id1;
COMMIT;

http://sqlfiddle.com/#!9/f287cd/1

如果你对文本有唯一约束......你可以使用这个

START TRANSACTION;
SET @text1 := 'Hello', @text2 := 'Bye';
SELECT @id1 := ID FROM `Table 1` WHERE text=@text1;
SELECT @id2 := ID FROM `Table 1` WHERE text=@text2;
UPDATE `Table 1` SET text=NULL WHERE ID = @id2;
UPDATE `Table 1` SET text=@text2 WHERE ID = @id1;
UPDATE `Table 1` SET text=@text1 WHERE ID = @id2;
COMMIT;

http://sqlfiddle.com/#!9/a3d49/1

关于MySQL 在一个原子操作中更新两行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37686515/

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