Как я могу удалить записи MySQL, которые имеют поле, которое не является числовым? - PullRequest
0 голосов
/ 02 декабря 2011

Из-за повреждения данных у нас есть поле базы данных (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 //

Ответы [ 2 ]

1 голос
/ 02 декабря 2011

Вы можете использовать регулярные выражения для поиска нечисловых полей.Следующий запрос найдет все строки, для которых значение указанного столбца не является числовым:

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

Сначала удаляются все соответствующие строки из дочерней таблицы, затем удаляются строки родительской таблицы.Используйте на свой страх и риск, очевидно.

0 голосов
/ 02 декабря 2011

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].+';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...