Из-за повреждения данных у нас есть поле базы данных (Mysql 5), заполненное текстом.Это настраиваемое поле в ExpressionEngine CMS и не было задано только как числовое.Мне нужно удалить только те записи, для которых это поле было заполнено некорректно.Он содержит URL вместо идентификатора, например, 10937.
Мне нужно запустить запрос / хранимую процедуру, которая найдет только те записи, которые были заполнены неправильно, т.е. не содержат числовой идентификатор, и удалит эти записи, плюссвязанные записи в другой таблице.
Буду признателен за лучший способ сделать это.Я мог сделать это из 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 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 //