最近我一直试图找到一种方法,以便只替换特定用户的一部分列。 系统是为游戏制作的,其中items列是分层的(-1,-1,-1,-1,-1,-1,-1,-1)......我需要一种方法来替换其中一个那些带有新值的值,但是当我无法弄清楚如何去做时。
作为我需要实现的一个例子 旧项目 - (-1,-1,-1,-1,-1,-1,-1,-1) 新项目 - (1838,-1,-1,-1,-1,-1,-1,-1)
下次你做同样的事情时它会替换下一个-1值。
非常感谢能帮助我弄清楚如何做到这一点的人。
- 编辑 - 我忘了提到我们有超过4000个帐户。所以替换脚本将仅指定给其中一个帐户。
答案 0 :(得分:0)
如果数据位于数据库的一列中,您可以尝试替换命令
update TABLE_NAME set FIELD_NAME = replace(FIELD_NAME, ‘(-1, -1, -1, -1, -1, -1, -1, -1)’, ‘(1838, -1, -1, -1, -1, -1, -1, -1)’);
答案 1 :(得分:0)
为了速度和可用性,您应该考虑将这些数组分解为规范化数据。但是,解决方案是:
用子串索引打破你的字符串。
set @a='(-1, -1, 2, -1, -1, -1, -1, -1)';
set @pos=3;
SELECT
concat(
SUBSTRING_INDEX(@a, ',', @pos-1), -- before item 3
' ,', -- separator
SUBSTRING_INDEX(SUBSTRING_INDEX(@a, ',', @pos),',', -1), -- item 3
' ,', -- separator
SUBSTRING_INDEX(@a, ',', -(8-@pos)) -- after item 3, in an array of 8 items; you could find array length dinamically by replacing comas with "" and comparing new string length to old length +1
)
>'(-1, -1, 2, -1, -1, -1, -1, -1)'
更新:
update table user_items
set items= concat(
SUBSTRING_INDEX(items, ',', @pos-1), -- before item 3
' ,', -- separator
'NEW ITEM HERE',
' ,', -- separator
SUBSTRING_INDEX(items, ',', -(8-@pos)) -- after item 3
)
where user_id=1