2012-06-25 43 views
0

我想更新字段的值,如果字符串列在两个数字之间。更新MySQL字段;条件=两个数字之间的字符串字段

UPDATE SAMPLE.EXAMPLE 
SET modNum = CONCAT(modNum,"26") 
WHERE modNum NOT LIKE '%26%' 
    AND (procKey BETWEEN 90000 AND 99123 OR procKey = 77444); 

不幸的是我得到一个错误:

Error Code: 1292. Truncated incorrect DOUBLE value: '4123F '

我很惊讶,因为当我做了选择,我得到预期的结果。

​​

CREATE TABLE语句:

'CREATE TABLE `example` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `modNum` char(4) DEFAULT NULL, 
    `procKey` char(8) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1' 

样本数据:

INSERT INTO `SAMPLE`.`EXAMPLE` (`modNum`, `procKey`) VALUES ('42', '99001'); 
INSERT INTO `SAMPLE`.`EXAMPLE` (`modNum`, `procKey`) VALUES ('42', '9900f'); 

我能做些什么来更新给我的条件列?



对我来说,它看起来像一个bug。我能想到的最好的方法是使用正则表达式来检查procKey的值是否为整数。我更改我的UPDATE语句为:

UPDATE SAMPLE.EXAMPLE 
SET modNum = CONCAT(modNum,"26") 
WHERE modNum NOT LIKE '%26%' 
    AND procKey REGEXP '^[0-9]+$' 
    AND (procKey BETWEEN 90000 AND 99123 
     OR procKey = 77444); 

请让我知道是否有更好的方法。

+0

看起来像一个错误。 – jcho360

+0

modNum的数据类型是什么? –

+0

谢谢@ jcho360。如果它是一个我能够相信的错误,你有没有建议的方法呢? – donbyte

回答

1

对我来说,它看起来像一个bug。我能想到的最好的方法是使用正则表达式来检查procKey的值是否为整数。我更改我的UPDATE语句为:

UPDATE SAMPLE.EXAMPLE 
SET modNum = CONCAT(modNum,"26") 
WHERE modNum NOT LIKE '%26%' 
    AND procKey REGEXP '^[0-9]+$' 
    AND (procKey BETWEEN 90000 AND 99123 
     OR procKey = 77444); 

请让我知道是否有更好的方法。

0

试试这个:

UPDATE SAMPLE.EXAMPLE 
SET modNum = CONCAT(modNUM,"26") 
WHERE modNum NOT LIKE '%26%' 
    AND (procKey BETWEEN 90000 AND 99123 OR procKey = 77444); 
+0

感谢CONCAT的建议,我想我会这么做的......但这不是我的问题所在。 – donbyte

0

它为我工作,所以我”敢肯定那一定是一些bug。

mysql> CREATE TABLE `example` (
    -> `id` int(11) NOT NULL AUTO_INCREMENT, 
    -> `modNum` char(4) DEFAULT NULL, 
    -> `procKey` char(8) DEFAULT NULL, 
    -> PRIMARY KEY (`id`) 
    ->) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1 
    -> ; 
Query OK, 0 rows affected (0.04 sec) 

mysql> UPDATE EXAMPLE                
-> SET modNum = CONCAT(modNum,"26") 
    -> WHERE modNum NOT LIKE '%26%' 
    -> AND (procKey BETWEEN 90000 AND 99123 OR procKey = 77444); 
ERROR 1146 (42S02): Table 'SOF.EXAMPLE' doesn't exist 
mysql> UPDATE example 
    -> SET modNum = CONCAT(modNum,"26") 
    -> WHERE modNum NOT LIKE '%26%' 
    -> AND (procKey BETWEEN 90000 AND 99123 OR procKey = 77444); 
Query OK, 0 rows affected (0.00 sec) 
Rows matched: 0 Changed: 0 Warnings: 0 

mysql> select version(); 
+-----------+ 
| version() | 
+-----------+ 
| 5.5.9  | 
+-----------+ 
1 row in set (0.00 sec) 

编辑:

mysql> INSERT INTO `example` (`modNum`, `procKey`) VALUES ('42', '99001'); 
Query OK, 1 row affected (0.00 sec) 

mysql> INSERT INTO `example` (`modNum`, `procKey`) VALUES ('42', '9900f'); 
Query OK, 1 row affected (0.00 sec) 
mysql> UPDATE example SET modNum = CONCAT(modNum,"26") WHERE modNum NOT LIKE '%26%' AND (procKey BETWEEN 90000 AND 99123 OR procKey = 77444); 
Query OK, 0 rows affected, 2 warnings (0.00 sec) 
Rows matched: 0 Changed: 0 Warnings: 2 

mysql> show warnings; 
+---------+------+----------------------------------------------+ 
| Level | Code | Message          | 
+---------+------+----------------------------------------------+ 
| Warning | 1292 | Truncated incorrect DOUBLE value: '9900f ' | 
| Warning | 1292 | Truncated incorrect DOUBLE value: '9900f ' | 
+---------+------+----------------------------------------------+ 
2 rows in set (0.00 sec) 
+0

顺便说一句,在我的版本中,例子!= example,所以请检查小写和大写以防万一 – jcho360

+0

你用procKey填充了什么值?确保它与某些字段是整数并且其他字段是混合的。 – donbyte

+0

这是一个空表,但仍然如果你想去pastie.org并给我一些数据来填充表 – jcho360

相关问题