介紹如何在 MySQL/MariaDB 資料庫使用 UPDATE
指令更新指定的資料。
建立測試用資料
為了示範 UPDATE
使用方式,我們先建立測試用的 products
資料表:
-- 建立 products 資料表 CREATE TABLE products ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(255), price INT UNSIGNED, inventory INT UNSIGNED, last_update DATE, PRIMARY KEY (id) );
再插入一些測試用的資料:
-- 新增資料 INSERT INTO products (name, price, inventory, last_update) VALUES ("A031", 320, 9, "2015-10-14"), ("C001", 420, 0, "2013-03-08"), ("B021", 280, 3, "2013-12-02"), ("Y158", 690, 4, "2015-11-21"), ("A202", 195, 1, "2019-02-23"), ("D022", 540, 5, "2017-03-19");
顯示測試用的資料:
-- 顯示所有資料 SELECT * FROM products;
+----+------+-------+-----------+-------------+ | id | name | price | inventory | last_update | +----+------+-------+-----------+-------------+ | 1 | A031 | 320 | 9 | 2015-10-14 | | 2 | C001 | 420 | 0 | 2013-03-08 | | 3 | B021 | 280 | 3 | 2013-12-02 | | 4 | Y158 | 690 | 4 | 2015-11-21 | | 5 | A202 | 195 | 1 | 2019-02-23 | | 6 | D022 | 540 | 5 | 2017-03-19 | +----+------+-------+-----------+-------------+
UPDATE
更新資料
UPDATE
可以用來更新資料表中已經存在的資料,例如更新某項產品的售價,同時更新 last_update
欄位(記錄最後更新日期):
-- 新增資料 UPDATE products SET price = 480, last_update = CURDATE() WHERE id = 1;
查看更新後的結果:
-- 查看更新結果 SELECT * FROM products WHERE id = 1;
+----+------+-------+-----------+-------------+ | id | name | price | inventory | last_update | +----+------+-------+-----------+-------------+ | 1 | A031 | 480 | 9 | 2019-10-15 | +----+------+-------+-----------+-------------+
遞增、遞減更新數值
除了直接指定新的值之外,UPDATE
也可以根據原始的數值遞增或遞減(或其他各種運算),例如進貨時增加庫存量:
-- 遞增更新資料 UPDATE products SET inventory = inventory + 5 WHERE id = 1;
查看更新後的結果:
-- 查看更新結果 SELECT * FROM products WHERE id = 1;
+----+------+-------+-----------+-------------+ | id | name | price | inventory | last_update | +----+------+-------+-----------+-------------+ | 1 | A031 | 480 | 14 | 2019-10-15 | +----+------+-------+-----------+-------------+
依序更新
有時候再更新多筆資料時,更新的先後順序會有影響,這時候就可以利用 ORDER BY
來指定更新的順序。
假設我們現在想更改資料的主 id
欄位,將每筆資料的主 id
都遞增 1
,但是由於主 id
是不可以重複的,我們必須從最大 id
資料開始更新,否則就會出現 id
重複的錯誤,這時候就可以這樣寫:
-- 依序更新資料 UPDATE products SET id = id + 1 ORDER BY id DESC;
更新之後的資料會像這樣:
-- 顯示所有資料 SELECT * FROM products;
+----+------+-------+-----------+-------------+ | id | name | price | inventory | last_update | +----+------+-------+-----------+-------------+ | 2 | A031 | 480 | 14 | 2019-10-15 | | 3 | C001 | 420 | 0 | 2013-03-08 | | 4 | B021 | 280 | 3 | 2013-12-02 | | 5 | Y158 | 690 | 4 | 2015-11-21 | | 6 | A202 | 195 | 1 | 2019-02-23 | | 7 | D022 | 540 | 5 | 2017-03-19 | +----+------+-------+-----------+-------------+
跨資料表更新
UPDATE
也可以橫跨多張資料表更新,例如:
-- 跨資料表更新 UPDATE products, orders SET orders.price = product.price WHERE orders.name = products.name;
參考資料:MySQL 官方文件