Mysql
CONCAT_WS 導致部分工作的“數據太長”?
我有一個包含幾列的簡單表格,我正在嘗試將其中的兩個合併為一個。我正在使用 MySQL 5.5,我可以通過 MySQL Workbench 執行以下(匿名)查詢來重現特定數據集的錯誤:
UPDATE person SET a = CONCAT_WS('\n', a, b)
它清楚地產生以下響應消息:
Error Code: 1406. Data too long for column 'a' at row 34
因為兩者
a
和b
都是VARCHAR(200)
響應是公平的,但我希望並希望由於它產生了錯誤,因此不會送出任何更改。然而,顯然確實如此。我無法在較小的虛擬數據集上重現它。我正在使用自動送出。我的假設是錯誤的查詢不會改變任何值嗎?它可能是我的 MySQL 伺服器的自動送出或其他設置的一些功能嗎?
請詢問我的規範中是否缺少任何明顯的細節。
我希望並希望由於它產生錯誤,因此不會送出任何更改
原因在於嚴格的 SQL 模式。
當發生錯誤(而不是警告)時,僅忽略其餘行,已更新的行不會回滾。
請參閱嚴格的 SQL 模式:
對於 STRICT_ALL_TABLES,MySQL 返回錯誤並忽略其餘行。但是,由於較早的行已被插入或更新,結果是部分更新。為避免這種情況,請使用單行語句,該語句可以在不更改表的情況下中止。
“單行語句”是什麼意思?
這是一個嚴格影響一行的語句。通過 WHERE 條件和/或通過 LIMIT 邊界。如果發生警告轉換為錯誤,則更新中的行不會更改。
兩者都是
a
_b``VARCHAR(200)
這意味著連接的值最多可以是 402 個符號。所以使用
UPDATE person SET a = LEFT(CONCAT_WS('\n', a, b), 200); -- truncate if too long
或者
UPDATE person SET a = CONCAT_WS('\n', a, b) WHERE LENGTH(CONCAT_WS('\n', a, b)) <= 200; -- do not update if too long