【问题标题】:delete rows from multiple tables in mysql从mysql中的多个表中删除行
【发布时间】:2020-08-19 03:18:40
【问题描述】:

我有一个名为 project1 的数据库。它有 200 多个不同名称的表。 每个表都有一些条目。

现在我想从时间戳低于 2017-12-30 23:59:50 的所有表中删除这些条目(我只想从 2018 年起将条目保留在数据库中)。

如何编写相同的sql查询?

【问题讨论】:

  • 或许可以考虑重构您的数据

标签: mysql stored-procedures


【解决方案1】:

在加入时,您只能在单个 sql 语句中删除多个表。并且没有很好的方法来加入您的表以找到您想要的记录。而是一次只做一张桌子:

delete from table1 where Date <= '2017-12-30 23:59:50';
delete from table2 where Date <= '2017-12-30 23:59:50';
...

如果您希望它立即生效,请将其包装在事务中。

要在单个查询中一次最多查询 60 个表,您可以执行以下操作:

delete t1,t2,t3
from (select Date from table1 union select Date from table2 union select Date from table3) d
left join table1 t1 on t1.Date=d.Date
left join table2 t2 on t2.Date=d.Date
left join table3 t3 on t3.Date=d.Date
where d.Date <= '2017-12-30 23:59:50';

但我不知道这会有多低效,也看不出有任何理由你想这样做,而不是仅仅使用多个查询。

【讨论】:

  • 感谢您的建议,但它对我不起作用
  • @VimalNayak 你做了什么查询,它给出了什么错误?
【解决方案2】:

你的语法不正确

CREATE TABLE table1 (
  `id` INT,
  `date` DATE,
  week_day  varchar(10)
  
);
CREATE TABLE table2 (
  `id` INT,
  `date` DATE,
  week_day  varchar(10)
  
);
CREATE TABLE table3 (
  `id` INT,
  `date` DATE,
  week_day  varchar(10)
  
);
INSERT INTO table1
  (`id`, `date`,week_day)
VALUES
  ('1', '2017-07-22',NULL),
  ('2', '2017-07-28',NULL),
  ('3', '2020-07-30',NULL),
  ('4', '2020-07-27',NULL),
  ('5', '2020-07-28',NULL),
  ('6', '2020-08-15',NULL),
  ('7', '2017-07-27',NULL),
  ('  8', '2020-07-29',NULL),
  ('9', '2020-07-31',NULL);
INSERT INTO table2
  (`id`, `date`,week_day)
VALUES
  ('1', '2017-07-22',NULL),
  ('2', '2017-07-28',NULL),
  ('3', '2020-07-30',NULL),
  ('4', '2020-07-27',NULL),
  ('5', '2020-07-28',NULL),
  ('6', '2020-08-15',NULL),
  ('7', '2017-07-27',NULL),
  ('  8', '2020-07-29',NULL),
  ('9', '2020-07-31',NULL);
INSERT INTO table3
  (`id`, `date`,week_day)
VALUES
  ('1', '2018-07-22',NULL),
  ('2', '2018-07-28',NULL),
  ('3', '2020-07-30',NULL),
  ('4', '2017-07-27',NULL),
  ('5', '2017-07-28',NULL),
  ('6', '2020-08-15',NULL),
  ('7', '2017-07-27',NULL),
  ('  8', '2020-07-29',NULL),
  ('9', '2020-07-31',NULL);
DELETE  t1,t2,t3 FROM table1 t1, table2 t2 , table3 t3 
WHERE t1.`date`  <= '2017-12-30 23:59:50' AND
t2.`date`  <= '2017-12-30 23:59:50' AND
t3.`date`  <= '2017-12-30 23:59:50'
SELECT * FROM table1
编号 |日期 | week_day -: | :--------- | :-------- 3 | 2020-07-30 | 4 | 2020-07-27 | 5 | 2020-07-28 | 6 | 2020-08-15 | 8 | 2020-07-29 | 9 | 2020-07-31 |
SELECT * FROM table2
编号 |日期 | week_day -: | :--------- | :-------- 3 | 2020-07-30 | 4 | 2020-07-27 | 5 | 2020-07-28 | 6 | 2020-08-15 | 8 | 2020-07-29 | 9 | 2020-07-31 |
SELECT * FROM table3
编号 |日期 | week_day -: | :--------- | :-------- 1 | 2018-07-22 | 2 | 2018-07-28 | 3 | 2020-07-30 | 6 | 2020-08-15 | 8 | 2020-07-29 | 9 | 2020-07-31 |

db小提琴here

一个存储过程会是这样的,你得熟练使用select语句 你也可以灵活处理数据

DROP procedure IF EXISTS `dowhile`;

DELIMITER $$
CREATE DEFINER=`root`@`%` PROCEDURE `dowhile`()
BEGIN 
    DECLARE finished INTEGER DEFAULT 0;
    DECLARE _tablename varchar(100) DEFAULT "";
    
    DEClARE curtable_name 
        CURSOR FOR
        SELECT
            TABLE_NAME
        FROM
            INFORMATION_SCHEMA.TABLES
        WHERE
            TABLE_NAME LIKE 'testr%';
    DECLARE CONTINUE HANDLER 
        FOR NOT FOUND SET finished = 1;

    OPEN curtable_name;

        gettable_name: LOOP
                FETCH curtable_name INTO _tablename;
            IF finished = 1 THEN 
                LEAVE gettable_name;
            END IF;
            -- build email list
            SET @sql = CONCAT("DELETE  FROM ",_tablename," WHERE `date`  <= '2017-12-30 23:59:50';");
            PREPARE stmt1 FROM @sql;
            EXECUTE stmt1;
            DEALLOCATE PREPARE stmt1;
        END LOOP gettable_name;
    CLOSE curtable_name;
END$$

DELIMITER ;

【讨论】:

  • 如果任何表中都没有 2017 年的行,则不会删除任何内容:dbfiddle.uk/…
  • 感谢您的建议,但我的数据库中有 200 多个表,因此可以应用任何其他逻辑吗?
  • @VimalNayak 我认为您在使用多个实际不存在的查询时发现了一些问题。
  • 然后你编写一个存储过程,使用 INFORMATION_SCHELA,你可以获取所有符合描述的表名,然后在循环中逐一删除的语句,当你写 3 个表时,我给出一个回答3张桌子,
  • 我已经通过 INFORMATION_SCHELA 检索了所有表名,但不知道如何编写存储过程。
猜你喜欢
  • 2014-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多