3 回答

TA貢獻(xiàn)1776條經(jīng)驗(yàn) 獲得超12個(gè)贊
你不能只是交換價(jià)值。您需要臨時(shí)變量第一種方式:
UPDATE table_name SET column1=column2, column2=@temp WHERE (@temp:=column1) > column2;
第二種方式:這種方式更好,因?yàn)樗鼨z查任何值是否為 NULL
UPDATE table_name SET column1=(@temp:=column1), column1= column2, column2 = @temp WHERE column1 > column2;
第二種方式很簡(jiǎn)單。它比較兩個(gè)列并在需要時(shí)交換這個(gè)列。

TA貢獻(xiàn)1830條經(jīng)驗(yàn) 獲得超9個(gè)贊
在UPDATE語(yǔ)句中,MySql 在使用更新列的值時(shí)使用非標(biāo)準(zhǔn) SQL 行為,因?yàn)樵谶@樣的語(yǔ)句中:
SET a = x, b = a
a賦值中的值b = a不會(huì)是表中存儲(chǔ)的原始值,而是a賦值后的值a = x。
所以這:
update tablename
set column1 = column2,
? ? column2 = column1
在其他數(shù)據(jù)庫(kù)中可以使用的方法在 MySql 中不起作用。
有一個(gè)不使用變量或不必要的連接的解決方法:
update tablename
set column1 = column1 + column2,
? ? column2 = column1 - column2,
? ? column1 = column1 - column2
where column1 > column2;
從以下開始工作:
單表 UPDATE 分配通常從左到右評(píng)估。
結(jié)果:
| id? | column1 | column2 |
| --- | ------- | ------- |
| 1? ?| 3? ? ? ?| 50? ? ? |
| 2? ?| 4? ? ? ?| 51? ? ? |

TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超2個(gè)贊
您在表上有一個(gè)主鍵,所以一個(gè)簡(jiǎn)單的選擇是join:
update t join
? ? ? ?t t2
? ? ? ?on t.id = t2.id
? ? set t.x = t2.y,?
? ? ? ? t.y = t2.x
? ? where t.x > t.y;
這是一個(gè) db<>fiddle。
出于以下幾個(gè)原因,我更喜歡這種方法而不是使用變量:
這不取決于子句的評(píng)估順序set,我認(rèn)為 MySQL 不能保證這一點(diǎn)。
我認(rèn)為在 MySQL 8+ 中不推薦使用這種變量
它不依賴于表達(dá)式的順序,因此更健壯并且更容易適應(yīng)更復(fù)雜的表達(dá)式。
- 3 回答
- 0 關(guān)注
- 167 瀏覽
添加回答
舉報(bào)