如果我有一个包含以下行的表:
animal (primary)
-------
man
dog
cow
,我想删除所有行并插入新行(可能包含一些相同的数据),例如:
animal (primary)
-------
dog
chicken
wolf
我可以简单地执行以下操作:
delete from animal;
,然后插入新行。
但是,当我这样做时,一瞬间,“狗”将无法通过SELECT语句访问。
我可以简单地插入忽略新数据,然后删除其余数据,一个接一个,但是当我有很多行时,这感觉不是正确的解决方案。
有没有办法插入新数据,然后让MySQL随后自动删除其余数据?
我有一个程序,每隔5分钟从该表中选择数据(我现在编写的代码将每30分钟更新一次该表),所以我想一直保持尽可能高的准确性,而且我宁愿在一秒钟内有太多行而不是同时有太多行。
注意:我知道这似乎是不必要的,但是我只是觉得,如果我将这些可能性的可能性过多地留在了不同的地方,有时就会出问题。
答案 0 :(得分:1)
您可以添加另一列timestamp
并更改select语句以适应需要检查最新值的这种情况。
如果这是在学校里,我会说您需要一个时间戳,而这正是您的教授正在寻找的。您不需要截断表来获取最新值,您需要调整表背后的思想以及查询数据的方式。希望这会有所帮助!
查看以下内容:
How to make a mysql table with date and time columns?
Why not update values instead?
我的其他问题是:
Select
的方式吗? 答案 1 :(得分:1)
您可能要在这里使用TRUNCATE而不是DELETE。 TRUNCATE比DELETE快,并且可以将表重置回空状态(这意味着IDENTITY列也将重置为原始值)。
不知道为什么选择删除并重新添加的值时会遇到问题,也许我缺少某些上下文。但是,如果将表擦干净,则可能需要使用truncate。
答案 2 :(得分:0)
如果您不想添加新列,则还有另一种方法。
1.第一步,以任何将表中所有现有行标记为将来删除的方式更新表。例如:
UPDATE `table_name` SET `animal`=CONCAT('MUST_BE_DELETED_', `animal`)
DELETE FROM `table_name` WHERE `animal` LIKE 'MUST_BE_DELETED_%'
答案 3 :(得分:0)
您可以通过将updated_on
列用作时间戳来实现此目的,甚至可以使用一些默认值,但是我们来看一个没有它们的示例。
我认为表格看起来像这样:
CREATE TABLE `new_table` (
`animal` varchar(255) NOT NULL,
`updated_on` timestamp,
PRIMARY KEY (`animal`)
) ENGINE=InnoDB
这只是一个虚拟表示例。重要的是稍后的两个查询。
您只需执行查询即可插入数据,例如:
insert into my_table(animal)
select animal from my_view where animal = 'dogs'
on duplicate key update
updated_on = current_timestamp;
请注意,my_view是您的表/视图/查询,通过它您可以提供要插入表中的值。还要注意,在此示例中,您需要在animal
列上具有主键/唯一键约束,才能正常工作。
然后,您继续进行以下查询,以“清除”(删除)旧值:
delete from my_table
where updated_on < (
select *
from (
select max(updated_on) from my_table
) as max_date
);
请注意,您可以单独查看一个视图,以便获取update_on条目的max_date值。该条目应指示上一个查询中最后一次更新/插入的值的时间戳,因此您可以在where
子句中继续使用该时间戳,以删除不再想要/不再需要的旧记录。
重要提示: 由于您正在执行多个查询,因此应该将其作为一个操作,因此建议您在单个事务中使用它,并对各种可能的结果(例如,在mysql异常的情况下)进行适当的回滚。您可能希望为此使用适当的存储过程。