Mysql

INSERT / UPDATE 合併數據,當空數據為空字元串時

  • December 4, 2013

考慮一些家庭成員的表格:

mysql> SELECT * FROM some_table;
+--------+--------+--------+
| f_name | l_name | work   |
+--------+--------+--------+
| Meirav | Cohen  | school |
| Dotan  | Cohen  |        |
+--------+--------+--------+
2 rows in set (0.00 sec)

假設f_name是主鍵,並且所有列都是VARCHAR. 未知數據不表示為 NULL,而是表示為空字元串(如work列中所示)。

我想添加一些我知道的關於一個人的數據,但我不想查詢數據庫以查看其中的內容,而是讓數據庫將現有值與新值合併:

mysql> INSERT INTO some_table (f_name, l_name, work)
   VALUES ('Dotan', '', 'php')
   ON DUPLICATE KEY UPDATE
       f_name = IFNULL(f_name, 'Dotan'),
       l_name = IFNULL(l_name, ''),
       work   = IFNULL(work,   'php');

當然,IFNULL不適合這項工作,因為它只檢查 NULL,而不是空字元串。此外,還有一個缺點是要添加的每個值必須在 SQL 中出現兩次。

**有沒有辦法讓數據庫將數據與空字元串合併?**另外,是否可以使要插入的字元串在 SQL 中只出現一次?

INSERT為了避免在語句中使用兩次值,請使用VALUES(<column_name>)函式。

INSERT … ON DUPLICATE KEY UPDATE 語法

您可以在 UPDATE 子句中使用 VALUES(col_name) 函式來引用來自 INSERT … ON DUPLICATE KEY UPDATE 語句的 INSERT 部分的列值。換句話說,ON DUPLICATE KEY UPDATE 子句中的 VALUES(col_name) 是指在沒有發生重複鍵衝突的情況下將插入的 col_name 的值。此功能在多行插入中特別有用。VALUES() 函式僅在 INSERT … UPDATE 語句中有意義,否則返回 NULL。

不幸的是,你的問題不是很清楚你想要的結果是什麼。但是假設您只想更新具有NULL或空字元串的列,您可以這樣做

INSERT INTO some_table (f_name, l_name, work)
VALUES ('Dotan', '', 'php')
ON DUPLICATE KEY UPDATE
 f_name = COALESCE(NULLIF(f_name, ''), VALUES(f_name)),
 l_name = COALESCE(NULLIF(l_name, ''), VALUES(l_name)),
 work   = COALESCE(NULLIF(work, ''), VALUES(work));

這是**SQLFiddle**展示

如果它不是您想要的,請考慮發布您想要的結果並解釋您想要更新的條件下的值

引用自:https://dba.stackexchange.com/questions/54335