【问题标题】:Delete MySQL table with an Iterator使用迭代器删除 MySQL 表
【发布时间】:2011-12-21 02:16:22
【问题描述】:

是否可以像迭代一样在 while 循环中删除?
例如:

id值
1 12
1 13 - 应该删除
1 14 - 应该删除
2 15.3
2 43 - 应该删除
2 22 - 应该删除

现在我需要删除每第二和第三 ( i%2==0 || i%3==0 ) 行。

【问题讨论】:

  • 对于每个 id,你只有三个值还是可以有更多?
  • 使用一些脚本语言来构建和启动 SQL DELETE。
  • @Marco 只有三个值
  • 您还应该检查您正在使用的条件。 ( i%2==0 || i%3==0 ) 也会导致第四行被删除。这样会更好:( (i%2==0 && (i+1)%3==0) || i%3==0 ).
  • 术语“2nd”和“3rd”只有在行被排序时才有意义。那么,您的订单是什么?是:{id, value},正如您的示例所暗示的那样? (顺便说一句,如果您使用的是 InnoDB,行本身是按 PK 排序的,但 MyISAM 不做这样的保证。)

标签: mysql sql database conditional-statements


【解决方案1】:
mysql> select * from t;
+------+-------+
| id   | value |
+------+-------+
|    1 |    12 |
|    1 |    13 |
|    1 |    14 |
|    2 |    15 |
|    2 |    43 |
|    2 |    22 |
+------+-------+
6 rows in set (0.00 sec)

mysql> set @c = 0;
Query OK, 0 rows affected (0.00 sec)

mysql> delete t
    -> from t join (
    ->   select t.*, mod(@c := @c + 1, 3) c
    ->   from t
    ->   order by id, value
    ->   ) t1
    -> on t1.id = t.id
    -> and t1.value = t.value
    -> and t1.c != 1;
Query OK, 4 rows affected (0.05 sec)

mysql> select * from t;
+------+-------+
| id   | value |
+------+-------+
|    1 |    12 |
|    2 |    15 |
+------+-------+
2 rows in set (0.00 sec)

如果不是第 3、4 个,但您需要每组一个:

mysql> select * from t;
+------+-------+
| id   | value |
+------+-------+
|    1 |    12 |
|    1 |    13 |
|    1 |    14 |
|    2 |    15 |
|    2 |    43 |
|    2 |    22 |
+------+-------+
6 rows in set (0.00 sec)

mysql> delete t
    -> from t
    -> left join (
    ->   select * from t
    ->   group by id
    ->   ) t1
    -> on t1.id = t.id
    -> and t1.value = t.value
    -> where t1.id is null;
Query OK, 4 rows affected (0.07 sec)

mysql> select * from t;
+------+-------+
| id   | value |
+------+-------+
|    1 |    12 |
|    2 |    15 |
+------+-------+
2 rows in set (0.00 sec)

【讨论】:

    【解决方案2】:

    备份后试试这个:

    DROP TABLE IF EXISTS temptt;
    CREATE TEMPORARY TABLE temptt (`id` INT, `value` INT);
    INSERT INTO temptt 
        SELECT * FROM your_table GROUP BY id;
    DELETE t1.* 
    FROM your_table t1 LEFT JOIN temptt t2
        ON t1.id = t2.id AND t1.value = t2.value
    WHERE t2.id IS NULL;
    

    想法是在临时表中插入不应该删除的数据,然后删除your_table中不在该表中的所有数据。

    【讨论】:

      猜你喜欢
      • 2013-11-25
      • 2012-02-12
      • 1970-01-01
      • 2016-12-02
      • 2016-11-29
      • 2019-09-11
      • 1970-01-01
      • 1970-01-01
      • 2016-07-19
      相关资源
      最近更新 更多