[SQL] 有資料就更新(UPDATE),沒資料就新增(INSERT)

sql是程式設計師在存取資料庫時常用到的一種語言,明確的告訴我們如何用來新增(INSERT)、刪除(DELETE)、修改(UPDATE)、查詢(SELECT)處理資料庫中的資料。

當然,這四個看似基本的步驟,但是在使用上還是有革外小心,否則很容易增加資料庫的Loading或是資料異常的情形出現。 資料庫存取的第一步就是新增資料,沒有資料在裡面,後面的動作也無法進行(如何你手上有一個現成的資料庫例外)。

新增(INSERT INTO)資料進資料庫不是太難的事,就算新增進去還是有提供修改(UPDATE)的功能。 以往在處理資料庫的新增(INSERT INTO)與修改(UPDATE)問題時都是分開處理,越處理就越發現兩件事有時候差不多,存取同樣的資料庫、資料表,甚至一樣的資料欄位,而最常做的思考動作則是「資料已存在就更新(UPDATE),不存在時就新增(INSERT)」。



用程式設計師的邏輯去思考一下,這個問題不難處理。首先,SELECT一下資料項目是否存在,若有存在則UPDATE,不存在就INSERT,程式碼可能如下:



$sql = "SELECT * FROM `abc` WHERE `id` = '1'";
$sth = $dbh->prepare($sql);
$count = $sth->rowCount(); //取得資料筆數

if ($count !=0) {
    $sql = "UPDATE...";
} else {
    $sql = "INSERT INTO...";
}
這個寫法沒問題,可以run,但是就是麻煩了點。要處理這樣動作的情形不算少數,每次都要寫這樣一堆,有時候還挺麻煩的。 不過,好在程式設計師是全世界最懶的動物,他們怎麼可能容忍這樣的事情發生,所以在MySql裡有一種寫法,可以直接解決這個問題,那就是INSERT INTO...ON DUPLICATE KEY UPDATE...。 上面的SQL語法就可以改成:

$sql = "INSERT INTO `abc` (`id`, `name`, `number`) VALUES ('1', 'Jack', '3') ON DUPLICATE KEY UPDATE `name` = 'John', `number` = '4'";
$sth = $dbh->prepare($sql);
只要一行就完成了。另外,就是這個寫了的使用條件就是「資料表中必須存在Primary Key或Unique Index」且「新增的欄位必須包含上述兩者之一」,否則你叫程式以什麼去判斷這筆資料到底是存在還是不存在。


留言

這個網誌中的熱門文章

[JQuery] Position: absolute與relative在不同縮放比網頁中的位移