Mysql
INSERT / UPDATE 合併數據,當空數據為空字元串時
考慮一些家庭成員的表格:
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**展示
如果它不是您想要的,請考慮發布您想要的結果並解釋您想要更新的條件下的值