【发布时间】:2020-08-19 03:18:40
【问题描述】:
我有一个名为 project1 的数据库。它有 200 多个不同名称的表。 每个表都有一些条目。
现在我想从时间戳低于 2017-12-30 23:59:50 的所有表中删除这些条目(我只想从 2018 年起将条目保留在数据库中)。
如何编写相同的sql查询?
【问题讨论】:
-
或许可以考虑重构您的数据
我有一个名为 project1 的数据库。它有 200 多个不同名称的表。 每个表都有一些条目。
现在我想从时间戳低于 2017-12-30 23:59:50 的所有表中删除这些条目(我只想从 2018 年起将条目保留在数据库中)。
如何编写相同的sql查询?
【问题讨论】:
在加入时,您只能在单个 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';
但我不知道这会有多低效,也看不出有任何理由你想这样做,而不是仅仅使用多个查询。
【讨论】:
你的语法不正确
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'
编号 |日期 | 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 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 -: | :--------- | :-------- 1 | 2018-07-22 | 空 2 | 2018-07-28 | 空 3 | 2020-07-30 | 空 6 | 2020-08-15 | 空 8 | 2020-07-29 | 空 9 | 2020-07-31 | 空SELECT * FROM table3
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 ;
【讨论】: