我的表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,但仍会违反FK约束。张贴的答案并没有谈到FK。
答案 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;