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

时间:2016-06-07 18:17:13

标签: mysql foreign-keys

我的表ID是PK ID,varchar(20)有一些文本。那个PK也是另一个表中的FK 我尝试在两行之间切换ID,但我无法这样做,因为MySQl会因为FK约束错误而原因阻止此行,该行将违反FK约束但仅限于毫秒,因为我将使另一行再次存在该ID。 例如

表1

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约束。
  3. 我该怎么做?

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

3 个答案:

答案 0 :(得分:1)

简单的解决方法:使用中间值。

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

答案 1 :(得分:1)

试试这个:

UPDATE Table1 SET text="new value" where id=1

答案 2 :(得分:1)

您可以尝试交换“表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