问题描述:由于个人操作不当(所谓不当是因为创建表的时候日期顺手设置成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