2017-03-09 15 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;

(再次我不确定这是否有记录的行为,因此 - '灰色地带')。

相关问题