删除值在100000000-199999999之间

时间:2012-10-13 16:00:27

标签: mysql innodb

我需要修改以下代码以删除值为1xxxxxxxx和3xxxxxxxx(所以,100000001,100000002等)的所有内容,但我对SQL的了解并不完美。有没有人可以帮我修改这个脚本?

SET @increment_id = '100000001';

SELECT *
FROM `sales_flat_quote_address_item`
WHERE `sales_flat_quote_address_item`.`quote_address_id` IN ( 
    SELECT `address_id` 
        FROM `sales_flat_quote_address` 
        WHERE `sales_flat_quote_address`.`quote_id` IN (
        SELECT `entity_id`
            FROM `sales_flat_quote`
            WHERE `sales_flat_quote`.`reserved_order_id` = @increment_id
            )
    );

DELETE  
FROM `sales_flat_quote_shipping_rate`
WHERE `sales_flat_quote_shipping_rate`.`address_id` IN ( 
    SELECT `address_id` 
        FROM `sales_flat_quote_address` 
        WHERE `sales_flat_quote_address`.`quote_id` IN (
        SELECT `entity_id`
            FROM `sales_flat_quote`
            WHERE `sales_flat_quote`.`reserved_order_id` = @increment_id
            )
    );



DELETE 
FROM `sales_flat_quote_address`
WHERE `sales_flat_quote_address`.`quote_id` IN ( 
    SELECT `entity_id`
        FROM `sales_flat_quote`
        WHERE `sales_flat_quote`.`reserved_order_id` = @increment_id
    );


DELETE FROM `sales_flat_quote_item_option`
WHERE `sales_flat_quote_item_option`.`item_id`  IN ( 
    SELECT `item_id` 
        FROM `sales_flat_quote_item` 
        WHERE `sales_flat_quote_item`.`quote_id` IN (
        SELECT `entity_id`
            FROM `sales_flat_quote`
            WHERE `sales_flat_quote`.`reserved_order_id` = @increment_id
            )
    );


DELETE FROM `sales_flat_quote_item`
WHERE `sales_flat_quote_item`.`quote_id` IN ( 
    SELECT `entity_id`
        FROM `sales_flat_quote`
        WHERE `sales_flat_quote`.`reserved_order_id` = @increment_id
    );


DELETE FROM `sales_flat_quote_payment`
WHERE `sales_flat_quote_payment`.`quote_id` IN ( 
    SELECT `entity_id`
        FROM `sales_flat_quote`
        WHERE `sales_flat_quote`.`reserved_order_id` = @increment_id
    );


DELETE FROM `sales_flat_quote`
WHERE `sales_flat_quote`.`reserved_order_id` = @increment_id;


DELETE FROM `sales_order_datetime`
WHERE `sales_order_datetime`.`entity_id` IN ( 
    SELECT `entity_id`
        FROM `sales_order`
        WHERE `sales_order`.`increment_id` = @increment_id
    );


DELETE FROM `sales_order_decimal`
WHERE `sales_order_decimal`.`entity_id` IN ( 
    SELECT `entity_id`
        FROM `sales_order`
        WHERE `sales_order`.`increment_id` = @increment_id
    );

DELETE FROM `sales_order_int`
WHERE `sales_order_int`.`entity_id` IN ( 
    SELECT `entity_id`
        FROM `sales_order`
        WHERE `sales_order`.`increment_id` = @increment_id
    );

DELETE FROM `sales_order_text`
WHERE `sales_order_text`.`entity_id` IN ( 
    SELECT `entity_id`
        FROM `sales_order`
        WHERE `sales_order`.`increment_id` = @increment_id
    );


DELETE FROM `sales_order_varchar`
WHERE `sales_order_varchar`.`entity_id` IN ( 
    SELECT `entity_id`
        FROM `sales_order`
        WHERE `sales_order`.`increment_id` = @increment_id
    );

DELETE FROM `sales_order_entity_datetime`
WHERE `sales_order_entity_datetime`.`entity_id` IN ( 
    SELECT `entity_id`
        FROM `sales_order_entity`
        WHERE `sales_order_entity`.`increment_id` = @increment_id
    );


DELETE FROM `sales_order_entity_decimal`
WHERE `sales_order_entity_decimal`.`entity_id` IN ( 
    SELECT `entity_id`
        FROM `sales_order_entity`
        WHERE `sales_order_entity`.`increment_id` = @increment_id
    );

DELETE FROM `sales_order_entity_int`
WHERE `sales_order_entity_int`.`entity_id` IN ( 
    SELECT `entity_id`
        FROM `sales_order_entity`
        WHERE `sales_order_entity`.`increment_id` = @increment_id
    );

DELETE FROM `sales_order_entity_text` 
WHERE `sales_order_entity_text`.`entity_id` IN ( 
    SELECT `entity_id`
        FROM `sales_order_entity`
        WHERE `sales_order_entity`.`increment_id` = @increment_id
    );

DELETE FROM `sales_order_entity_varchar`
WHERE `sales_order_entity_varchar`.`entity_id`  IN ( 
    SELECT `entity_id`
        FROM `sales_order_entity`
        WHERE `sales_order_entity`.`increment_id` = @increment_id
    );

DELETE FROM `sales_order_entity`
WHERE `sales_order_entity`.`increment_id` = @increment_id;

DELETE FROM `sales_order`
WHERE `sales_order`.`increment_id` = @increment_id;

3 个答案:

答案 0 :(得分:0)

更改

WHERE `sales_flat_quote`.`reserved_order_id` = @increment_id

WHERE `sales_flat_quote`.`reserved_order_id` BETWEEN 100000000 AND 199999999

WAIT!标题为100000000-199999999,但问题是1xxxxxxxx and 3xxxxxxxx,所以如果是后者则将其更改为:

WHERE `sales_flat_quote`.`reserved_order_id` BETWEEN 100000000 AND 399999999

或者,您可以选择使用REGEXP运算符:

WHERE `sales_flat_quote`.`reserved_order_id` REGEXP '^[123][[:digit:]]{8}'

答案 1 :(得分:0)

通常情况下,我建议这样做。但如果性能不是问题,您可以使用:

...
WHERE LEFT(`sales_order`.`increment_id`, 1) = 1 
    AND RIGHT(`sales_order`.`increment_id`, 8) BETWEEN 0 and 99999999

...
WHERE LEFT(`sales_flat_quote`.`reserved_order_id`, 1) = 1 
    AND RIGHT(`sales_flat_quote`.`reserved_order_id`, 8) BETWEEN 0 and 99999999

这假设字段长度为9个字符。它会将最左边的值与1匹配,并检查右边的范围。

也许您可能还想在出现问题时使用交易?

答案 2 :(得分:0)

您可以使用以下脚本删除所有以1或3开头的记录:

DELETE 
FROM 'sales_flat_quote_address_item'
WHERE
'sales_flat_quote_address_item'.'quote_address_id' like '1%'
OR 
'sales_flat_quote_address_item'.'quote_address_id' like '3%';