我可以在删除所有旧行(相同的主行除外)之前向MySQL添加行吗?

时间:2018-10-26 18:52:34

标签: mysql

如果我有一个包含以下行的表:

animal (primary)
-------
man
dog
cow

,我想删除所有行并插入新行(可能包含一些相同的数据),例如:

animal (primary)
-------
dog
chicken
wolf

我可以简单地执行以下操作:

delete from animal;

,然后插入新行。

但是,当我这样做时,一瞬间,“狗”将无法通过SELECT语句访问。

我可以简单地插入忽略新数据,然后删除其余数据,一个接一个,但是当我有很多行时,这感觉不是正确的解决方案。

有没有办法插入新数据,然后让MySQL随后自动删除其余数据?

我有一个程序,每隔5分钟从该表中选择数据(我现在编写的代码将每30分钟更新一次该表),所以我想一直保持尽可能高的准确性,而且我宁愿在一秒钟内有太多行而不是同时有太多行。

注意:我知道这似乎是不必要的,但是我只是觉得,如果我将这些可能性的可能性过多地留在了不同的地方,有时就会出问题。

4 个答案:

答案 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`)
  1. 第二步,插入新行。
  2. 在最后一步,删除所有标记的行:
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异常的情况下)进行适当的回滚。您可能希望为此使用适当的存储过程。