2017-03-09 16 views
6

我正在使用MySQL 5.5.37。我想消除我的更新語句,如下所示的警告......如何重寫我的MySQL更新語句以消除「截斷不正確的INTEGER值」警告?

update resource r 
    set grade_id = convert(substring_index(substring_index(
        r.description, 'Grade ', -1), ' ', 1), unsigned integer) 
    where r.description like '% Grade%' 
     and CONVERT(SUBSTRING_INDEX(SUBSTRING_INDEX(
        r.description, 'Grade ', -1), ' ' ,1),UNSIGNED) > 0; 

Query OK, 0 rows affected, 7 warnings (0.02 sec) 
Rows matched: 1333 Changed: 0 Warnings: 7 

mysql> show warnings; 
+---------+------+--------------------------------------------------+ 
| Level | Code | Message           | 
+---------+------+--------------------------------------------------+ 
| Warning | 1292 | Truncated incorrect INTEGER value: ''   | 
| Warning | 1292 | Truncated incorrect INTEGER value: ''   | 
| Warning | 1292 | Truncated incorrect INTEGER value: ''   | 
| Warning | 1292 | Truncated incorrect INTEGER value: 'MyCo'  | 
| Warning | 1292 | Truncated incorrect INTEGER value: 'MyCo'  | 
| Warning | 1292 | Truncated incorrect INTEGER value: 'MyCo'  | 
| Warning | 1292 | Truncated incorrect INTEGER value: 'MyCo'  | 
+---------+------+--------------------------------------------------+ 

我不明白的是我如何重寫我的查詢給出不同的是沒有價值的更新匹配什麼樣的警告正在抱怨。下面是我的查詢,我列出正在更新不同的值...

mysql> select distinct substring_index(substring_index(
       r.description, 'Grade ', -1), ' ', 1) 
      from resource r 
      where r.description like '% Grade%' 
      and CONVERT(SUBSTRING_INDEX(SUBSTRING_INDEX(
       r.description, 'Grade ',-1),' ',1),UNSIGNED) > 0; 
+-----------------------------------------------------------------------+ 
| substring_index(substring_index(r.description, 'Grade ', -1), ' ', 1) | 
+-----------------------------------------------------------------------+ 
| 7                  | 
| 8                  | 
| 11                 | 
| 9                  | 
| 12                 | 
| 10                 | 
| 6                  | 
+-----------------------------------------------------------------------+ 

如何重寫我的更新語句,以便它更新相同的值,而不tryihng截斷不正確的整數?

+0

顯示您的數據。 – olegsv

+0

我已經做了。它在最後一個查詢中從資源r(其中r.description如'%Grade%'和CONVERT(SUBSTRING_INDEX(SUBSTRING_INDEX(r) .description,'Grade',-1),'',1),UNSIGNED)> 0;「。如果您希望我運行其他查詢,請告訴我您希望我運行的內容。 – Dave

+0

你能否展示_raw_數據是什麼以及你希望表中的_final_結果(更新後)看起來像什麼? –

回答

3

據我所知關心你得到警告,由於WHERE子句條件

CONVERT(SUBSTRING_INDEX(SUBSTRING_INDEX(r.description, 'Grade ',-1),' ',1),UNSIGNED) > 0 

可以清楚地在警告聲明截斷由於爲''MyCo值不正確INTEGER值一提。

| Level | Code | Message           | 
+---------+------+--------------------------------------------------+ 
| Warning | 1292 | Truncated incorrect INTEGER value: ''   | 
| Warning | 1292 | Truncated incorrect INTEGER value: ''   | 
| Warning | 1292 | Truncated incorrect INTEGER value: ''   | 
| Warning | 1292 | Truncated incorrect INTEGER value: 'MyCo'  | 
| Warning | 1292 | Truncated incorrect INTEGER value: 'MyCo'  | 
| Warning | 1292 | Truncated incorrect INTEGER value: 'MyCo'  | 
| Warning | 1292 | Truncated incorrect INTEGER value: 'MyCo' 

這表明你沒有爲價值的特定模式中resourcedescription列。

像下面

description 
Foo Grade 100 Bar 
Foo Grade 99 Grade 
Foo Grade 98 Grade MyCO 

,如上面的代碼在第二&第三排您在記錄多個Grade字符串。 其中間接影響SUBSTRING_INDEX(SUBSTRING_INDEX(r.description, 'Grade ',-1),' ',1),一行。 所以我的建議是請確保所有記錄插入正確。 如果所有記錄都已正確插入並檢查它們是否包含描述符列的多種類型的模式。如果包含多個模式,則必須使用UNION來重寫此查詢。一個模式的單個查詢和另一個模式的另一個查詢。

只需嘗試下面更新的查詢。

update resource r 
    set grade_id = convert(substring_index(substring_index(
        r.description, 'Grade ', -1), ' ', 1), unsigned integer) 
    where r.description like '% Grade%' 
    and substring_index(substring_index(r.description, 'Grade ', -1), ' ', 1) REGEXP '[0-9]+'; 

希望這個解釋可以幫助你。

+0

嗯..你的例子看起來非常類似於[rexester demo](http://rextester.com/TVHN10678)。那只是巧合嗎? –

+0

需要「錨定」:'​​REGEXP'^ [0-9] + $'' –

1

根據您的警告輸出,您的resource.description列中的某處有''MyCo。將非數字數據傳遞給convert函數,這是警告來自的地方。

我不知道你的原始數據是什麼樣的,但是如果你運行下面的查詢,它應該識別resource.description格式不正確的任何行。

select distinct substring_index(substring_index(r.description, 'Grade ', -1), ' ', 1) 
from resource r 
order by r.description 

您也可以嘗試在查詢上運行EXPLAIN。這可能會給你更多的見解。我不知道MySQL的內部,但是儘管有一個where子句,但轉換函數可能會以某種方式查看所有行。

2

由於WHERE子句而不是SELECT子句,您將收到警告。由於無效的(非數字)值被轉換爲0條件

CONVERT(SUBSTRING_INDEX(SUBSTRING_INDEX(
      r.description, 'Grade ',-1),' ',1),UNSIGNED) > 0 

retuns false。因此這些行不會出現在結果中。刪除條件選擇語句來看看哪些行導致的警告:

select distinct 
    substring_index(substring_index(
     r.description, 'Grade ', -1), ' ', 1), 
    CONVERT(SUBSTRING_INDEX(SUBSTRING_INDEX(
     r.description, 'Grade ',-1),' ',1),UNSIGNED), 
     r.description 
from resource r 
where r.description like '% Grade%'; 

例子:http://rextester.com/TVHN10678

,因爲我不知道你的數據,我不能幫助解決問題。

2

你能否在轉換之前使用trim()來刪除可能已經進入的空格?這些也是原因警告

2

你可以嘗試使用正則表達式,是這樣的:

其中r.description像 '%品位%' 和SUBSTRING_INDEX(SUBSTRING_INDEX( r.description, 'Grade',-1),'',1)REGEXP'^ [0-9] + $';

或者,如果你不害怕步入灰色地帶:你也可以嘗試不轉換成相同的查詢在所有 - 出奇它可能只是工作:

其中r.description像「%品位%' 和SUBSTRING_INDEX(SUBSTRING_INDEX( r.description,'Grade',-1),'',1)> 0;

(再次我不確定這是否有記錄的行爲,因此 - '灰色地帶')。

相關問題