2012-06-25 42 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

相關問題