Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更新SQL表中所选数据中的列并将其保存_Sql_Postgresql_Sql Update - Fatal编程技术网

更新SQL表中所选数据中的列并将其保存

更新SQL表中所选数据中的列并将其保存,sql,postgresql,sql-update,Sql,Postgresql,Sql Update,我有一个名为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-

我有一个名为
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
,我只有一个数据库,我担心数据会弄乱,我该怎么做

应该是这样的

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';

日期列是日期时间格式

编辑

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

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

然后删除2021-05-31所在的行,以

对于这一点,我猜查询将是:

DELETE FROM datatable 
WHERE date = '2021-05-31';

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

更新datatable SET date=“new date”其中date=“old date”和source=“previous source”以及reading=“previous reading”和其他字段

但是,为了让您的生活更轻松,我建议添加id列(自动递增和主键),并使用以下方法更新数据:


更新您的更新查询…。其中id=“target id”

您的第二次示例更新符合您的要求

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

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


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

如何在删除旧数据之前先添加新行作为更新?首先添加新ID列:ALTER TABLE datatable add ID INT,然后将其标记为主键:ALTERTABLE datatable ADD primary key idI强烈建议您也阅读有关ALTERTABLE语句的更多信息,谷歌it;)现在我的意思是,等等,我会更新问题请看一看,我能做一个合成吗?我认为它必须是独一无二的你能看看这个问题吗?
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  

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