如何基于选择和更新查询更新列数据

时间:2019-06-26 11:38:38

标签: mysql sql-update

我有以下数据

| 2015-08-30 01:23:01 |
| 2015-08-30 03:14:50 |
| 2015-08-30 04:29:55 |
| 2015-08-30 09:18:57 |
| 2015-08-30 13:36:51 |
| 2015-08-31 02:19:33 |
| 2015-08-31 03:14:59 |
| 2015-08-31 04:33:10 |
| 2015-08-31 10:56:42 |
| 2015-08-31 12:25:54 |
| 2015-09-01 02:29:00 |
| 2015-09-01 03:19:40 |
| 2015-09-01 04:47:51 |
| 2015-09-01 13:56:06 |
| 2015-09-02 03:15:13 |
| 2015-09-02 03:35:53 |
| 2015-09-02 04:16:31 |
| 2015-09-03 03:12:03 |
| 2015-09-03 03:37:21 |
| 2015-09-03 05:01:30 |

上方数据是表datetime中的build

现在我需要编写查询以完成以下操作

1:将年份从2015年更改为2019年,然后将所有内容保持原样

这就是我编写查询的方式

mysql> UPDATE buildinfo SET datetime = '2019%' where datetime = (select a.datetime from buildinfo as a where datetime LIKE '2015%');
ERROR 1093 (HY000): You can't specify target table 'buildinfo' for update in FROM clause
mysql>

我不确定该怎么写。我看过很多文档,其中一些文档提到了INNER JOIN,但无法理解。

请提出建议

6 个答案:

答案 0 :(得分:2)

尝试一下

UPDATE buildinfo set datetime = replace(datetime, '2015', '2019') where datetime LIKE '2015%';

它将在datetime栏中将2015年更改为2019年,并保留所有内容。

  • 但是在应用此功能之前,请对存储的数据进行备份。

答案 1 :(得分:1)

datetime值并不总是一个字符串,您可能在MySQL-8.0中发现它们不起作用。幸运的是,这里有大量的date and time functions

所以:

UPDATE buildinfo
SET datetime=DATE_ADD(datetime, INTERVAL 4 YEAR)
WHERE datetime BETWEEN '2015-01-01 00:00:00' AND '2015-12-31 23:59:59'

答案 2 :(得分:1)

在年份为2015年的日期中添加4年:

UPDATE buildinfo 
SET datetime = DATE_ADD(datetime, INTERVAL 4 YEAR)
WHERE YEAR(datetime) = 2015;

请参见demo

答案 3 :(得分:1)

如果更新

UPDATE
   buildinfo
SET datetime = '2019%'
where datetime = (
  select
     a.datetime
  from  
    buildinfo as a
  where datetime LIKE '2015%'
);

是正确的,因为我没有检查。
您可以对其进行一些重写,以便MySQL确实接受它而不会给出错误。

UPDATE
   buildinfo
SET datetime = '2019%'
where datetime = (
  select alias.datetime from(
    select
       a.datetime
    from  
      buildinfo as a
    where datetime LIKE '2015%'
  ) alias
);

但是,当您查看示例表/数据时,以下查询会更好。

UPDATE
  buildinfo
SET
 buildinfo.datetime = buildinfo.datetime + INTERVAL 4 YEAR
WHERE
 YEAR(buildinfo.datetime) = 2015

答案 4 :(得分:0)

请尝试将DATE_FORMAT用于更新查询

UPDATE buildinfo
SET `datetime` = DATE_FORMAT(`datetime`,'2019-%m-%d %T')
WHERE YEAR(`datetime`) = '2015';

答案 5 :(得分:0)

使用字符串匹配功能替代danblacks答案:

data = [{'a' : 1, 'b': 1, 'c': 1},
        {'a' : 2, 'b': 2, 'c': 2},
        {'a' : 3, 'b': 3, 'c': 3},
        {'a' : 4, 'b': 4, 'c': 4},
        {'a' : 5, 'b': 5, 'c': 5},
        {'a' : 1, 'b': 2, 'c': 3},
        {'a' : 4, 'b': 5, 'c': 1},
        {'a' : 3, 'b': 4, 'c': 5},
        ]
pd.DataFrame(data)
不过,

danblacks的做法是正确的。我建议使用他的答案。