我最近运行了一个脚本,将数据从一个大表(大约20 GB)复制到另一个,我搞砸了,而日期时间列(称为timestamp
)的列值被保存到另一个列中varchar数据类型(称为category_name
),而timestamp
值已设置为NULL
或具有一系列随机日期时间值(如0000-00-00 00:00:00
,0003-02-01 00:00:00
,1990-12-00 00:00:00
等)。我复制的表也不断获取新数据。但是新数据没有损坏。我正在尝试确定从我的好数据开始的行的确切ID。请注意,有效值category_name
列可以是字母值,也可以是NULL
。我尝试了以下查询 -
SELECT * FROM table_name
WHERE `timestamp` IS NOT NULL
AND `timestamp` != "0000-00-00 00:00:00"
ORDER BY id;
当我发现timestamp
列中已保存所有类型的值时。
我接下来试过
SELECT * FROM table_name WHERE category_name REGEXP '[^a-zA-Z]' LIMIT 10;
哪个不起作用。
SELECT * FROM table_name WHERE category_name REGEXP '[:alpha:]' LIMIT 10;
也不起作用。
非常感谢任何帮助,谢谢。我只是想从我的category_name
列开始获取有效数据而不是日期时间字符串的位置获取大约的ids /行范围。
答案 0 :(得分:0)
答案 1 :(得分:0)
尝试使用STR_TO_DATE()功能。如果无法将字符串转换为日期,则返回NULL。并检查转换日期是否在您需要的范围内(在此示例中为去年(CURDATE()-365)
)
SELECT * FROM table_name
WHERE `timestamp` IS NOT NULL
AND LENGTH(`timestamp`)=19
AND IFNULL(STR_TO_DATE(`timestamp`,'%Y-%m-%d %h:%i:%s'),0)>CURDATE()-365
ORDER BY id limit 1;
答案 2 :(得分:0)
我终于使用数据库备份解决了这个问题。我恢复了在运行脚本时所采用的数据库备份。使用它我能够得到我的数据被破坏的ID。然后我将干净的数据(从该id开始)移动到此恢复的表并切换表名。这需要一段时间,导致一些数据丢失。