1. 程式人生 > >[轉]MySQL-5.7 Update語句詳解

[轉]MySQL-5.7 Update語句詳解

表達式 nor lec tle cat dep keyword join author

原文地址:https://www.cnblogs.com/tongxiaoda/p/7908977.html

.語法

(1)單表

UPDATE [LOW_PRIORITY] [IGNORE] table_reference
    SET assignment_list
    [WHERE where_condition]
    [ORDER BY ...]
    [LIMIT row_count]

value:
    {expr | DEFAULT}assignment:col_name = value

assignment_list:assignment [, assignment] ...

(2)多表

UPDATE [LOW_PRIORITY] [IGNORE] table_references
    SET assignment_list
    [WHERE where_condition]

註意:
1)如果沒有WHERE子句,則更新所有的行。
2)如果指定了ORDER BY子句,則按照被指定的順序對行進行更新。
3)LIMIT子句用於給定一個限值,限制可以被更新的行的數目。
4)多表更新時ORDER BY和LIMIT不能被使用;

2.用法示例

mysql> select * from students;
+-----+-------+--------+---------+
| sid | sname | gender | dept_id |
+-----+-------+--------+---------+
|   1 | aaa   | 1      |       2 |
|   2 | bbb   | 2      |       2 |
|   3 | ccc   | 3      |       2 |
|   4 | aaaa  | 1      |       1 |
|   5 | ddd   | 2      |       1 |
+-----+-------+--------+---------+
5 rows in set (0.00 sec)

mysql> update students set sname=‘eee‘,gender=‘3‘ where sid=4;
Query OK, 1 row affected (0.07 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from students;
+-----+-------+--------+---------+
| sid | sname | gender | dept_id |
+-----+-------+--------+---------+
|   1 | aaa   | 1      |       2 |
|   2 | bbb   | 2      |       2 |
|   3 | ccc   | 3      |       2 |
|   4 | eee   | 3      |       1 |
|   5 | ddd   | 2      |       1 |
+-----+-------+--------+---------+
5 rows in set (0.00 sec)

mysql> select * from students2;
+-----+-------+--------+---------+
| sid | sname | gender | dept_id |
+-----+-------+--------+---------+
|   1 | aaa   | 1      |       2 |
|   2 | 222   | 2      |       2 |
|   3 | ccc   | 3      |       2 |
|   4 | eee   | 3      |       1 |
|   5 | 111   | 1      |       1 |
+-----+-------+--------+---------+
5 rows in set (0.00 sec)

mysql> update students,students2 set students.sname=students2.sname,students.gender=students2.gender where students.sid=students2.sid;
Query OK, 2 rows affected (0.04 sec)
Rows matched: 5  Changed: 2  Warnings: 0

mysql> select * from students2;
+-----+-------+--------+---------+
| sid | sname | gender | dept_id |
+-----+-------+--------+---------+
|   1 | aaa   | 1      |       2 |
|   2 | 222   | 2      |       2 |
|   3 | ccc   | 3      |       2 |
|   4 | eee   | 3      |       1 |
|   5 | 111   | 1      |       1 |
+-----+-------+--------+---------+
5 rows in set (0.00 sec)

mysql> select * from students;
+-----+-------+--------+---------+
| sid | sname | gender | dept_id |
+-----+-------+--------+---------+
|   1 | aaa   | 1      |       2 |
|   2 | 222   | 2      |       2 |
|   3 | ccc   | 3      |       2 |
|   4 | eee   | 3      |       1 |
|   5 | 111   | 1      |       1 |
+-----+-------+--------+---------+
5 rows in set (0.00 sec)

1)單表修改是指修改指定單個表中的已經存在數據的一個或多個列的數值;set短語後面跟要修改的列和值;
2)where子句表示限定要修改表中的哪些數據,如果沒有where子句則表示所有行都要修改;
3)order by子句表示update數據按照指定的順序進行;
4)limit子句表示限定修改數據的行數;
5)多表修改是指修改table_references指定的多個表中滿足條件的行數據,多表修改不允許使用order by和limit子句;

特別註意:where的使用

mysql> select * from students2;
+-----+-------+--------+---------+
| sid | sname | gender | dept_id |
+-----+-------+--------+---------+
|   1 | aaa   | 1      |       2 |
|   2 | 222   | 2      |       2 |
|   3 | ccc   | 3      |       2 |
|   4 | eee   | 3      |       1 |
|   5 | 111   | 1      |       1 |
+-----+-------+--------+---------+
5 rows in set (0.00 sec)

mysql> update students2 set sname=‘555‘;
Query OK, 5 rows affected (0.04 sec)
Rows matched: 5  Changed: 5  Warnings: 0

mysql> select * from students2;
+-----+-------+--------+---------+
| sid | sname | gender | dept_id |
+-----+-------+--------+---------+
|   1 | 555   | 1      |       2 |
|   2 | 555   | 2      |       2 |
|   3 | 555   | 3      |       2 |
|   4 | 555   | 3      |       1 |
|   5 | 555   | 1      |       1 |
+-----+-------+--------+---------+
5 rows in set (0.00 sec)

3.屬性介紹

(1)Low_priortiy
表示修改語句需要等待其他鏈接的讀此表操作結束後再執行,只作用在MyISAM,MEMORY和MERGE存儲引擎;

(2)Ignore
表示當修改語句碰到違反唯一性約束條件等情況時,語句不會報錯回退而是報警告信息;
如果出現了重復關鍵字沖突,則這些行不會被更新。如果列被更新後,新值會導致數據轉化錯誤,則這些行被更新為最接近的合法的值。

4.update其他用法

(1)limit和ignore

mysql> select * from students;
+-----+-------+--------+---------+
| sid | sname | gender | dept_id |
+-----+-------+--------+---------+
|   1 | aaa   | 1      |       2 |
|   2 | 222   | 2      |       2 |
|   3 | ccc   | 3      |       2 |
|   4 | eee   | 3      |       1 |
|   5 | 111   | 1      |       1 |
+-----+-------+--------+---------+
5 rows in set (0.00 sec)

mysql> update students set sname=‘abc‘ limit 2;
Query OK, 2 rows affected (0.03 sec)
Rows matched: 2  Changed: 2  Warnings: 0

mysql> select * from students;
+-----+-------+--------+---------+
| sid | sname | gender | dept_id |
+-----+-------+--------+---------+
|   1 | abc   | 1      |       2 |
|   2 | abc   | 2      |       2 |
|   3 | ccc   | 3      |       2 |
|   4 | eee   | 3      |       1 |
|   5 | 111   | 1      |       1 |
+-----+-------+--------+---------+
5 rows in set (0.00 sec)

mysql> update students set sid=1 where sid=2;
ERROR 1062 (23000): Duplicate entry ‘1‘ for key ‘PRIMARY‘
mysql> update ignore students set sid=1 where sid=2;
Query OK, 0 rows affected, 1 warning (0.03 sec)
Rows matched: 1  Changed: 0  Warnings: 1

(2)表達式

col1只會比原值增加1
update t1 set col1=col1+1;

col2和col1的結果一樣
update t1 set col1=col1+1,col2=col1

(3)order by
指定update數據的順序,在某些情況下可以避免錯誤的發生;
如t表中的id字段是有唯一約束的,則以下第一個語句執行錯誤,第二個執行正常;

mysql> update students set sid=sid+1;
ERROR 1062 (23000): Duplicate entry ‘2‘ for key ‘PRIMARY‘
mysql> update students set sid=sid+1 order by sid desc;
Query OK, 5 rows affected (0.04 sec)
Rows matched: 5  Changed: 5  Warnings: 0

mysql> select * from students;
+-----+-------+--------+---------+
| sid | sname | gender | dept_id |
+-----+-------+--------+---------+
|   2 | abc   | 1      |       2 |
|   3 | abc   | 2      |       2 |
|   4 | ccc   | 3      |       2 |
|   5 | eee   | 3      |       1 |
|   6 | 111   | 1      |       1 |
+-----+-------+--------+---------+
5 rows in set (0.01 sec)

這是由於語句執行時,是從第一個開始,當1+1=2時,違反了唯一約束;

(4)多表修改
表之間通過where條件進行join操作

update items,month set items.price=month.price where items.id=month.id;

(5)UPDATE 語句使用來自另一個表的信息
修改表 titles 中的 ytd_sales 列,以反映表 sales 中的最新銷售記錄。

UPDATE titles
    SET ytd_sales = titles.ytd_sales + sales.qty
       FROM titles, sales
          WHERE titles.title_id = sales.title_id
          AND sales.ord_date = (SELECT MAX(sales.ord_date) FROM sales)

(6)UPDATE 語句與 SELECT 語句中的 TOP 子句一起使用
對來自表 authors 的前十個作者的 state 列進行更新

UPDATE authors
SET state = ‘ZZ‘ 
FROM (SELECT TOP 10 * FROM authors ORDER BY au_lname) AS t1
WHERE authors.au_id = t1.au_id

[轉]MySQL-5.7 Update語句詳解