I simplified the query and narrowed the problem down to the use of
SUBSTRING_INDEX:

UPDATE `param_str`
SET `value` =
   SUBSTRING_INDEX(
    `value`,
    ';',
    1
   ) + 1
 WHERE
 `id`=0  AND
 `name`='prf_hits'

Table structure:

CREATE TABLE `param_str` (
  `id` int(11) NOT NULL default '0',
  `name` varchar(32) NOT NULL default '',
  `value` varchar(255) default NULL,
  `match` varchar(255) default NULL,
  `match2` varchar(255) default NULL,
  `weight` tinyint(4) default NULL,
  KEY `id-name-value-match-match2`
(`id`,`name`,`value`(20),`match`(20),`match2`(20))
) TYPE=InnoDB;

Starting with value = 1
It often returns and affected rows count of the next bigger power of ten
minus the current value( i.e. 5 -> affected rows: 95; 102 -> 898; etc.)
Sometimes running the query repeatedly without another action in between
only 1 affected row is reported and the value is indeed only updated once.

Filed as http://bugs.mysql.com/8942

Regards, Jigal.

----- Original Message ----- 
From: "Jigal van Hemert" <[EMAIL PROTECTED]>
To: <mysql@lists.mysql.com>
Sent: Thursday, March 03, 2005 11:18 AM
Subject: Strange internal loop causing multiple updates on one record!?


> Tested on MySQL version 4.0.23, 4.1.8 and 4.1.10
> OS: RedHat Fedora Core 2 / RedHat 8
> Table type: InnoDB or MyISAM
>
> UPDATE `param_str`
> SET `value` =
>  CONCAT_WS(
>   ';',
>   (
>    SUBSTRING_INDEX(
>     COALESCE(`value`,''),
>     ';',
>     1
>    ) + 1
>   ),
>   CONCAT_WS(
>    ',',
>    SUBSTRING_INDEX(
>     REPLACE(
>      SUBSTRING(
>       COALESCE(`value`,'') FROM
>       LOCATE(
>        ';',
>        COALESCE(`value`,'')
>       ) + 1
>      ),
>      CONCAT(
>       ',' ,
>       '113',
>       ','
>      ),
>      ','
>     ),
>     ',' ,
>     -(9 -1)
>    ),
>    '113'
>   )
>  ) WHERE
>  `id`=6  AND
>  `name`='prf_hits'
>


-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to