由于数据损坏,我们有一个填充了文本的数据库字段(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 //
答案 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].+';