MySQL字符串拆分函数:SUBSTRING_INDEX——充满血泪的一次数据拯救记

问题描述:由于个人操作不当(所谓不当是因为创建表的时候日期顺手设置成date格式了,而需要存入的日期格式如下图【我拯救回来的】应该为varchar/char),导致录入数据库缺失,日期均变成了【0000-00-00】,由于是历史数据传输,所以对应的excel源文件还有,重新上传也行,但是假如我没有源文件怎么办?所以就想着用Mysql解决

在这里插入图片描述
数据说明:我有一列PK值是由【日期+字段A+字段B】构成的,所以我只要把PK拆分了就行

NO.1【数据拆分】
SUBSTRING_INDEX(str, delim, count)

参数名 解释
str 需要拆分的字符串
delim 分隔符,通过某字符进行拆分
count 当 count 为正数,取第 n 个分隔符之前的所有字符; 当 count 为负数,取倒数第 n 个分隔符之后的所有字符。

由于SUBSTRING_INDEX需要分割符,但是我的PK是直接拼接的,不过幸好我的字段A只有3个值(a,b,c)
先用replace替换出来固定符号

UPDATE table_name  SET 日期 = REPLACE(日期, 'a', ',') 
UPDATE table_name  SET 日期 = REPLACE(日期, 'b', ',') 
UPDATE table_name  SET 日期 = REPLACE(日期, 'c', ',') 

在此我以为大功告成的时候

#`**错误示范`**
UPDATE table_name SET 日期=(
SELECT SUBSTRING_INDEX( 日期,',',1) from table_name )

现实总是冰冷的
报错:You can't specify target table 'table_name' for update in FROM clause
大致意思就是:MySQL不允许SELECT FROM后面指向用作UPDATE的表。

相关问题解释:https://blog.csdn.net/qq_15071263/article/details/79001487

NO.2 创建一个辅助表

INSERT INTO test (
SELECT PK,SUBSTRING_INDEX( 日期,',',1) from table_name )

即把分割后的值连同PK字段一起放入临时表test里

No.3update 更新

UPDATE table_name w, test SET w.日期= test.日期
WHERE w.PK= test.PK

至此,拯救成功!耗费了我大概一个多小时,由于历史数据太多,耗时跟重新写一遍时间也差不多!但是这次尝试让我多掌握了一个知识点!每天进步一点点!!!
最后说一下这种update更新速度真快,8883行数据只用了0.304s
在这里插入图片描述

发布了48 篇原创文章 · 获赞 44 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_35866846/article/details/104680817