【问题标题】:Update a column within a selection of data in SQL table and save it更新 SQL 表中数据选择中的列并保存
【发布时间】:2021-06-01 14:40:00
【问题描述】:

我有一个名为 datatable 的 SQL 表。

date         source    reading    tday  yday
---------------------------------------------
2021-05-27   x1        x          x     x   
2021-05-27   x2        x          x     x  
2021-05-27   x3        x          x     x  
2021-05-28   x1        x          x     x   
2021-05-28   x2        x          x     x  
2021-05-28   x3        x          x     x  
2021-05-31   x1        x          x     x   
2021-05-31   x2        x          x     x  
2021-05-31   x3        x          x     x  

我想将日期从 2021-05-31 更新为 2021-06-01,我只有 1 个数据库,我担心会弄乱数据,我该怎么做?

应该是这样的

date         source    reading    tday  yday
----------------------------------------------
2021-05-27   x1        x          x     x   
2021-05-27   x2        x          x     x  
2021-05-27   x3        x          x     x  
2021-05-28   x1        x          x     x   
2021-05-28   x2        x          x     x  
2021-05-28   x3        x          x     x  
2021-06-01   x1        x          x     x   
2021-06-01   x2        x          x     x  
2021-06-01   x3        x          x     x  

我觉得应该是这样的

UPDATE date 
FROM datatable 
WHERE date = '2021-05-31' TO '2021-06-01';

UPDATE datatable 
SET date = '2021-06-01' 
WHERE date = '2201-05-31';

日期列是日期时间格式。

编辑。

如何先添加数据,然后删除旧数据?

因此,将 2021-05-31 的数据复制为 2021-06-01,(除日期外,所有其他列都是 2021-05-31 数据的列)

date         source    reading    tday  yday
---------------------------------------------
2021-05-27   x1        x          x     x   
2021-05-27   x2        x          x     x  
2021-05-27   x3        x          x     x  
2021-05-28   x1        x          x     x   
2021-05-28   x2        x          x     x  
2021-05-28   x3        x          x     x  
2021-05-31   x1        x          x     x   
2021-05-31   x2        x          x     x  
2021-05-31   x3        x          x     x  
2021-06-01   x1        x          x     x   
2021-06-01   x2        x          x     x  
2021-06-01   x3        x          x     x  

然后删除2021-05-31所在的行,这样我就结束了

为此,我猜查询是:

DELETE FROM datatable 
WHERE date = '2021-05-31';
date         source    reading    tday  yday
--------------------------------------------
2021-05-27   x1        x          x     x   
2021-05-27   x2        x          x     x  
2021-05-27   x3        x          x     x  
2021-05-28   x1        x          x     x   
2021-05-28   x2        x          x     x  
2021-05-28   x3        x          x     x  
2021-06-01   x1        x          x     x   
2021-06-01   x2        x          x     x  
2021-06-01   x3        x          x     x  

【问题讨论】:

    标签: sql postgresql sql-update


    【解决方案1】:

    为获得最安全的结果,请按照管理员数据库解决方案对没有主键的表执行此操作:

    UPDATE 数据表 SET date=“new-date” WHERE date=“old-date” AND source=“previous-source” AND reading=“previous-reading” AND 其余字段。

    但是,为了让您的生活更轻松,我建议添加 id 列 (AUTO_INCREATMENT & PRIMARY_KEY),并使用以下方法更新数据:

    更新您的更新查询...。 WHERE id="target-id"

    【讨论】:

    • 如何在删除旧数据之前先添加新行作为更新?
    • 先添加新的ID列:ALTER TABLE datatable ADD id INT,然后标记为主键:ALTER TABLE datatable ADD PRIMARY KEY id
    • 我强烈建议您也阅读更多关于 ALTER TABLE 语句的信息,谷歌一下 ;)
    • 请看一下
    • 也许只是删除这些行,而不进行更新。如果您想将特定日期的所有数据更新到新日期,只需这样做 - UPDATE datatable SET date=“new-date” WHERE date=“old-date”。将行更新为新日期后,执行您提供的命令 - 这很好
    【解决方案2】:

    您的第二个示例 UPDATE 可以满足您的需求。

    但你说得对,这样的 UPDATE 可能具有破坏性。许多具有像您这样的数据的系统在有新一天的数据时不会更新他们的表。相反,它们向表中插入新行,因此表中保存了历史记录。

    如果您担心您的桌子会变大,请不要担心。数据库擅长处理大表,尤其是您向我们展示的那种。而且您总是可以在某种维护工作中删除几年前的数据。

    如果我了解您的数据,您可以使用由 datesource 列组成的复合主键。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 2012-01-17
    • 1970-01-01
    相关资源
    最近更新 更多