mysql中replace函式的用法

javascript前鋒發表於2014-02-14

##-----MySQL資料替換即replace的運用-----##
#這裡主要介紹一些關於replace函式的用法。關於研究這個主要是發現replace功能很強大
#對於遮蔽關鍵字很有用處。
#現在繼續在以前的資料表中進行相關操作。
示例資料表:

mysql> select * from mytable;
+----+--------+-------+
| id | name   | count |
+----+--------+-------+
|  1 | 張三       |  1000 |
|  2 | 李四       |   500 |
|  3 | 王老虎      |   100 |
|  4 | 趙大      |  1000 |
|  5 | 王二小      |   500 |
|  6 | 三亞子       |   100 |
|  7 | ?阿瓊      |  1000 |
|  8 | 秋水蝦     |   500 |
| 22 | 害人精      |   100 |
+----+--------+-------+
9 rows in set (0.00 sec)
#這裡有9條原始資料,下面用replace進行資料的替換:
#update mytable set name=replace(name,'害人精','馬屁精');

mysql> update mytable set name=replace(name,'張三','阿瓊');
Query OK, 1 row affected (0.06 sec)
Rows matched: 9  Changed: 1  Warnings: 0
+----+--------+-------+
| id | name   | count |
+----+--------+-------+
|  1 | 阿瓊       |  1000 |
|  2 | 李四       |   500 |

#為了更加清晰的瞭解replace替換的方式,這裡我們讓其替換多個資料:
#update mytable set name=replace(name,'三','大炮');
#由於資料被更改過,裡面只有一個’三‘,這裡再新增幾條資料:
#insert into mytable(name,count) values ('三毛子','200');
#insert into mytable(name,count) values ('張三胖','250');

mysql> insert into mytable(name,count) values ('三毛子','200');
Query OK, 1 row affected (0.00 sec)

mysql> insert into mytable(name,count) values ('張三胖','250');
Query OK, 1 row affected (0.00 sec)

#現在進行替換:
mysql> update mytable set name=replace(name,'三','大炮');
Query OK, 3 rows affected (0.00 sec) #這裡顯示改變了三條資料,找資料表中有3天帶'三'資料
Rows matched: 11  Changed: 3  Warnings: 0

#結果:
|  6 | 大炮亞子         |   100 |
|  7 | ?阿瓊        |  1000 |
|  8 | 秋水蝦       |   500 |
| 22 | 馬屁精        |   100 |
| 23 | 大炮毛子        |   200 |
| 24 | 張大炮胖        |   250 |
+----+----------+-------+
11 rows in set (0.00 sec)

##多條資料替換
#一開始以為這是個錯誤的sql語句:
#update mytable set name=replace(name,'馬屁精','小馬哥'),name=replace(name,'小李子','李子');

mysql> update mytable set name=replace(name,'馬屁精','小馬哥'),name=replace(name
,'小李子','李子');
Query OK, 2 rows affected (0.00 sec)
Rows matched: 11  Changed: 2  Warnings: 0
#從結果來看,如果進行多組資料的替換可以使用上面的方式。

#接下來進行各個欄位的替換:
#update mytable set name=replace(name,'秋水蝦','吐絲草'),count=replace(count,100,300);

mysql> update mytable set name=replace(name,'秋水蝦','吐絲草'),count=replace(cou
nt,100,300);
Query OK, 7 rows affected (0.00 sec) #影響了7個結果,這確實出乎意料,按照我的預測應該
Rows matched: 11  Changed: 7  Warnings: 0 #為1+3=4個影響結果

#下面我們看看資料是如何變化的:
+----+----------+-------+
| id | name     | count |
+----+----------+-------+
|  1 | 阿瓊         |  3000 | #1000變為3000也就是說將前三位改變了。
|  2 | 李子         |   500 |
|  3 | 王老虎        |   300 | #100變為300,正常變化
|  4 | 趙大        |  3000 |
|  5 | 王二小        |   500 |
|  6 | 大炮亞子         |   300 |
|  7 | ?阿瓊        |  3000 |
|  8 | 吐絲草        |   500 |
| 22 | 小馬哥        |   300 |
| 23 | 大炮毛子        |   200 |
| 24 | 張大炮胖        |   250 |
+----+----------+-------+
11 rows in set (0.00 sec)

#對於這樣的結果只能看作是在replace中所有的資料都是字串。(僅個人認為)
#update mytable set name=replace(name,王二小,王鐵柱); #該方式無法通過
#update mytable set count=replace(count,'500','100');

mysql> update mytable set count=replace(count,'500','100');
Query OK, 3 rows affected (0.00 sec) #確實為預期結果
Rows matched: 11  Changed: 3  Warnings: 0

#為此,資料在replace中僅僅是字串
mysql> update mytable set count=replace(count,'300','150');
Query OK, 6 rows affected (0.00 sec) #結果再次得以證明
Rows matched: 11  Changed: 6  Warnings: 0

##綜上,replace可以用於一個欄位的多個資料替換,也可以用於不同欄位的替換。
#在mysql中replace可以在一定範圍內起到insert的作用,並且語法與之相似

#replace into mytable(name,count) values ('來福','70'),('力拓','600');
mysql> replace into mytable(name,count) values ('來福','70'),('力拓','600');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

#如果資料庫中有類似資料又該如何呢?
replace into mytable(name,count) values ('來福','70');
mysql> replace into mytable(name,count) values ('來福','70');
Query OK, 1 row affected (0.00 sec)

#這裡我們檢視一下該表的索引,看來索引為預設的ID.
mysql> show index from mytable;
+---------+------------+----------+--------------+-------------+-----------+----
---------+----------+--------+------+------------+---------+
| Table   | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Car
dinality | Sub_part | Packed | Null | Index_type | Comment |
+---------+------------+----------+--------------+-------------+-----------+----
---------+----------+--------+------+------------+---------+
| mytable |          0 | PRIMARY  |            1 | id          | A         |
      14 |     NULL | NULL   |      | BTREE      |         |
+---------+------------+----------+--------------+-------------+-----------+----
---------+----------+--------+------+------------+---------+
1 row in set (0.00 sec)

#根據文件介紹,如果只有一個索引,那麼replace相當於insert.
##記得我曾經建立了兩個表,現在我們切換到另一個資料較少的表mytab上進行操作演示:
mysql> show tables;
+----------------+
| Tables_in_mydb |
+----------------+
| mytab          |
| mytable        |
+----------------+
2 rows in set (0.00 sec)
#其預設的索引為id
mysql> show index from mytab;
+-------+------------+----------+--------------+-------------+-----------+------
-------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardi
nality | Sub_part | Packed | Null | Index_type | Comment |
+-------+------------+----------+--------------+-------------+-----------+------
-------+----------+--------+------+------------+---------+
| mytab |          0 | PRIMARY  |            1 | id          | A         |
     3 |     NULL | NULL   |      | BTREE      |         |
+-------+------------+----------+--------------+-------------+-----------+------
-------+----------+--------+------+------------+---------+
1 row in set (0.00 sec)

#現在需要向其中新增索引(在這裡遇到麻煩了,看來我對於建立索引不怎麼會啊,慚愧慚愧)。
#嘗試建立了多個索引都是失敗,暫時寫到這裡。。。。
寫這些並非上班不務正業,而是公司具體任務被安排到下週,接下來該忙了。

相關文章