mysql互換表中兩列資料方法

2021-09-04 11:32:06 字數 2379 閱讀 4476

小引

大千世界無奇不有,不怕做不到就怕想不到。在mysql軟體開發過程中,有時就需要把乙個表中的兩列資料進行交換。例如,我最近遇到的乙個案例是專案資料準備時客戶把**中兩列資料弄反了(把a列資料輸入到了b列,把b列資料輸入到了a列),真讓人苦笑不得。解決的最好辦法自然是直接修改系統資料庫對應表中資料----如果通過前台介面修改則麻煩大了!其實,細想來,實踐中很可能也存在要求根據情況交換**中兩列資料的案例。廢話不說了,看正文。

解決方案

使用update命令,這完全得益於mysql sql命令功能的強大支援。

**中原來資料類似如下:

select * from product; +----+--------+----------------+--------+

| id | name   | original_price | price  | +----+--------+----------------+--------+

|  1 | 雪糕   |           5.00 |   3.50 | |  2 | 鮮花   |          18.00 |  15.00 | |  3 | 甜點   |          25.00 |  12.50 | |  4 | 玩具   |          55.00 |  45.00 |

|  5 | 錢包   |         285.00 | 195.00 |

現在要求互換original_price與price的值,使用如下方法:

update product as a, product as b set a.original_price=b.price, a.price=b.original_price where a.id=b.id;
驗證一下:

select * from product; +----+--------+----------------+--------+

| id | name   | original_price | price  | +----+--------+----------------+--------+

|  1 | 雪糕   |           3.50 |   5.00 | |  2 | 鮮花   |          15.00 |  18.00 | |  3 | 甜點   |          12.50 |  25.00 | |  4 | 玩具   |          45.00 |  55.00 |

|  5 | 錢包   |         195.00 | 285.00 |

擴充套件問題

上面直接使用update交換乙個表中兩列(自然是同一資料型別)的例子有乙個特殊情況,其實也正是我要解決的真正問題。具體地說,我們的使用者在初期準備的部分資料中對於表中的兩列資料弄反了。但是,對於以後輸入的資料卻沒有弄反。這種情況下,我們需要找出前面弄反的記錄範圍,然後針對這部分記錄實施上面的操作。但遺憾的是,mysql中的update語句是不支援limit子句的。官方正規的描述如下:

for the multiple-table syntax, update updates rows in each table named in table_references that satisfy the conditions. each matching row is updated once, even if it matches the onditions multiple times.for multiple-table syntax, order by and limit cannot be used.

我試驗了一下,的確如此。

無奈我們只能使用變通的辦法。其中乙個方法是,先把上面指定範圍的記錄選擇出來並生成到乙個臨時表中,然後針對原表和這個臨時表使用update語句實現交換上面範圍記錄中各個對應字段值的目的。

但這裡有乙個小插曲是:mysql不直接支援類似於ms sql server的select into newtable這樣的語句。不過,我們可以使用變通的其他語句實現,如下:

create table tmp(select * from mv_person2 limit 0,10);
上面語句的含義是,生成乙個新錶tmp,該表中的字段及值是另乙個表mv_person2中從第1到第10條記錄資料。這樣便實現了上面生成乙個臨時表之目的。

有了上面的臨時表tmp,再使用update語句實現交換**mv_person2中指定範圍(例如從第1到第10條記錄資料)兩列便輕鬆了。答案如下:

update mv_person2 as a, tmp as b set a.original_price=b.price, a.price=b.original_price where a.id=b.id;
從而間接實現了交換乙個表中某指定範圍內兩列資料值之目的。

參考

mysql互換表中兩列資料方法

create table product id int 10 unsigned not null auto increment comment 產品id name varchar 50 not null comment 產品名稱 original price decimal 5,2 unsigned...

mysql互換表中兩列資料方法

create table product id int 10 unsigned not null auto increment comment 產品id name varchar 50 not null comment 產品名稱 original price decimal 5,2 unsigned...

mysql互換表中兩列資料方法

create tableproduct idint 10 unsigned not null auto increment comment 產品id namevarchar 50 not null comment 產品名稱 original pricedecimal 5,2 unsigned not...