如何删除字段不是数字的MySQL记录?

如何删除字段不是数字的MySQL记录?,mysql,stored-procedures,Mysql,Stored Procedures,由于数据损坏,我们有一个数据库字段(Mysql 5),其中填充了文本。它是ExpressionEngine CMS中的自定义字段,未设置为仅数字。我只需要删除此字段填充不正确的记录。它包含URL而不是ID,例如10937 我需要运行一个查询/存储过程,该过程将只查找那些填充不正确的记录,即不包含数字ID的记录,并删除这些记录以及其他表中的链接记录 我欢迎大家就如何做到这一点提出建议。我可以从PHP中完成,但希望在存储过程中完成,因为这将是一项有用的技能。具有可测试字段是否为数字的函数的详细信息。

由于数据损坏,我们有一个数据库字段(Mysql 5),其中填充了文本。它是ExpressionEngine CMS中的自定义字段,未设置为仅数字。我只需要删除此字段填充不正确的记录。它包含URL而不是ID,例如10937

我需要运行一个查询/存储过程,该过程将只查找那些填充不正确的记录,即不包含数字ID的记录,并删除这些记录以及其他表中的链接记录

我欢迎大家就如何做到这一点提出建议。我可以从PHP中完成,但希望在存储过程中完成,因为这将是一项有用的技能。具有可测试字段是否为数字的函数的详细信息。但事实上我需要的恰恰相反

我将选择有问题的记录的查询是:

SELECT field_id_58 as 'release_id' , ewt.entry_id FROM exp_weblog_data ewd
LEFT JOIN exp_weblog_titles ewt ON ewt.`entry_id` = ewd.`entry_id`
WHERE ewt.weblog_id = 15
这将返回我正在处理的所有cms条目ID,包括我要删除的条目ID。数据不正确的字段为字段\ id \ 58。该字段填充不正确这一事实意味着我们现在在表ewt和ewd中有重复的记录

以下是我目前掌握的情况:

DELIMITER //

CREATE PROCEDURE `proc_DEL_DUPLICATE_PR`
BEGIN
    DECLARE empty INT;
    DECLARE result ??? # not sure what data type this should be
    DECLARE cur1 CURSOR FOR SELECT field_id_58 as 'release_id' , ewt.entry_id FROM exp_weblog_data ewd
                            LEFT OUTER JOIN exp_weblog_titles ewt ON ewt.`entry_id` = ewd.`entry_id`
                            WHERE ewt.weblog_id = 15;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET empty=1;
    OPEN cur1;
    SET empty =0;
    WHILE empty = 0 DO
        FETCH cur1 INTO result;
        #if the release_id in the result row contains a URL string then delete rows for tables ewt, ewd for that entry_id
        END IF;
    END WHILE;

    CLOSE cur1;

END //

可以使用正则表达式查找非数字字段。以下查询将查找指定列的值为非数字的任何行:

SELECT * FROM table_name WHERE column_name REGEXP '[^0-9].+'
任何具有纯数值的行都不会返回。如果DELETE语句使用相同的WHERE子句,则应该这样做

要删除包含非数字列值的行,请尝试以下查询:

DELETE FROM exp_weblog_titles ewt 
    INNER JOIN exp_weblog_data ewd ON
        ewt.`entry_id` = ewd.`entry_id` 
    WHERE ewt.weblog_id = 15 AND ewd.field_id_58 REGEXP '[^0-9].+';

DELETE FROM exp_weblog_data ewd WHERE ewd.field_id_58 REGEXP '[^0-9].+';

它首先从子表中删除所有相关行,然后删除父表行。显然,使用SQL的风险由您自己承担。

实际需要的SQL如下所示:

DELETE FROM ewt
USING exp_weblog_titles AS ewt
INNER JOIN exp_weblog_data ewd ON ewt.entry_id = ewd.entry_id
WHERE ewt.weblog_id = 15 
AND ewd.field_id_58 REGEXP '[^0-9].+';

DELETE FROM exp_weblog_data ewd WHERE ewd.field_id_58 REGEXP '[^0-9].+';

谢谢知道我将如何访问“result”变量中的entry_id和release_id值,以及应该将其设置为什么数据类型吗?已更新以包含删除建议。我不知道你的最后一句话是什么意思,你想保留一些数据吗?再次感谢。我指的是在存储过程中创建结果变量的行。我假设“将cur1带入结果中;”将包含每行的条目id和发布id。