如何删除具有非数字字段的MySQL记录?

时间:2011-12-02 14:53:35

标签: mysql stored-procedures

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

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

我欢迎有关最佳方法的建议。我可以从PHP做到这一点,但希望在存储过程中这样做,因为这将是一个有用的技能学习。 This question包含一个函数的详细信息,可以测试字段是否为数字。但实际上我需要相反的事情。

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

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 entry_ids,包括我要删除的那些。数据不正确的字段是field_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 //

2 个答案:

答案 0 :(得分:1)

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

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].+';

它首先删除子表中的所有相关行,然后删除父表行。显然,使用风险自负。

答案 1 :(得分:0)

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].+';