簡體   English   中英

MySQL 更改表修改列在具有空值的行中失敗

[英]MySQL alter table modify column failing at rows with null values

我有一個大約有 10K 行的表,我試圖對其進行更改,以便字段fielddelimiter永遠不會為空。 我正在嘗試執行一個更改語句,期望將任何空值更改為默認值,但是我從 sql 語句中收到錯誤消息。

alter table merchant_ftp_account modify column `fielddelimiter` char(1) NOT NULL DEFAULT 't';

17:08:48  [ALTER - 0 row(s), 0.000 secs]  [Error Code: 1265, SQL State: 01000]  Data truncated for column 'fielddelimiter' at row 3987
... 1 statement(s) executed, 0 row(s) affected, exec/fetch time: 0.000/0.000 sec  [0 successful, 0 warnings, 1 errors]

據我了解,這意味着該行的數據超過了字段大小,但是 (a) 該行中的字段中的數據為 (null),並且 (b) 我能夠直接使用值 ' 更新該行t',我沒有收到截斷錯誤。 如果我用非空值更新該行並嘗試重新運行alter 語句,它會在fielddelimiter為空的下一行失敗。 [ETA:我知道 MySQL可以向任何方向更新,但我實際上可以在更改行時跟蹤其進度。]

MySQL 文檔中有一個警告:

Warning This conversion may result in alteration of data. For example, if you shorten a
string column, values may be truncated. To prevent the operation from succeeding if
conversions to the new data type would result in loss of data, enable strict SQL mode
before using ALTER TABLE (see Section 5.1.6, “Server SQL Modes”).

但它應該截斷的值是空值。 有人可以向我解釋這里發生了什么嗎? 以及如何解決?

[ETA:現有的fielddelimiter字段定義是 char(1)(允許空值,無默認值),因此它的值不應 > 1 個字符,並且選擇確認它沒有。 該字段中的不同值為 NULL、''(空字符串)、'p'、't' 和 'y'。]

我剛剛遇到這個錯誤,似乎解決方案是使用IGNORE語句:

ALTER IGNORE TABLE `table` CHANGE COLUMN `col` `col` int(11) NOT NULL;

請注意,您可能仍然存在數據截斷問題,因此請確保這是所需的結果。 使用 IGNORE 語句,它將抑制列中 NULL 值的數據截斷錯誤(可能還有其他錯誤!!!)

如果您的列具有 NULL 值,則不能將其更改為“NON NULL”。 首先將 NULL 值更改為其他值,然后再嘗試。

首先刪除任何空值

UPDATE merchant_ftp_account SET fielddelimiter='t' WHERE fielddelimiter IS NULL;

然后

ALTER TABLE merchant_ftp_account MODIFY COLUMN `fielddelimiter` char(1) NOT NULL DEFAULT 't';

在我的情況下,我將列設置為NOT NULL

ALTER TABLE `request_info` 
CHANGE COLUMN `col_2` `col_2` 
VARCHAR(2000) 
NOT NULL -- here was setting it to NULL when the existing col allowed NULL
AFTER `col_1`

以前我將列設置為DEFAULT NULL (即允許 NULL 值),所以如果你想允許 NULL 那么你可以執行以下操作:

ALTER TABLE `request_info` 
CHANGE COLUMN `col_2` `col_2` 
VARCHAR(2000) 
DEFAULT NULL -- changed from NOT --> DEFAULT 
AFTER `col_1`

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM