Mysql:更新命令没有改变

时间:2018-04-12 20:31:22

标签: mysql sql

2017-05-30 - > 20170530

 SET SQL_SAFE_UPDATES = 0;

 UPDATE stations.attenuation_smoothed
 SET date = DATE_FORMAT(date, '%Y/%m/%d') 
 WHERE counter = 1;

 SET SQL_SAFE_UPDATES = 1;

我也尝试过更新.....复制

但该表显示没有效果,查询运行时没有错误说

0 row(s) affected Rows matched: 1  Changed: 0  Warnings: 0

1 个答案:

答案 0 :(得分:0)

MySQL不会“计算”未被修改为“受影响”的行。也就是说,如果我们将值分配给导致行“无变化”的列,则该行不包括在“受影响的行”计数中。

该问题未指定名为date的列的数据类型

如果那是DATE数据类型,那么我们希望UPDATE语句(如问题中所示)不修改任何行,并返回“0行受影响”。

如果是字符数据类型,并且已经存储在列中的值采用格式'YYYY/MM/DD'表示有效日期值,那么我们也期望返回为“0行受影响”。

为了说明该声明没有对该行进行任何更改的原因,请考虑以下演示:

SELECT DATE_FORMAT('2018-04-12','%Y/%m/%d')                  AS str
     , DATE_FORMAT('2018-04-12','%Y/%m/%d') + INTERVAL 0 DAY AS dt

返回:

str         dt
----------  ----------
2018/04/12  2018-04-12

DATE数据类型是内部表示。从内部表示转换为字符串时,MySQL使用标准格式 YYYY-MM-DD

演示查询使用显式调用DATE_FORMATDATE(或DATETIMETIMESTAMP)值转换为指定格式的字符串表示形式。

请注意,字符串表示中出现的破折号分隔符实际上不是DATE值的一部分,这些是出现在字符串表示中的字符。

当我们将字符串分配给DATE列时,会将该字符串隐式转换为DATE数据类型。 MySQL对分隔符和格式相当宽容。考虑

SELECT DATE( '2018/4/12' ) AS dt1
     , DATE( '2018.4+12' ) AS dt2

这表明将字符串值转换为DATE数据类型。

dt1         dt2
----------  ----------
2018-04-12  2018-04-12

要在结果集中返回DATE值,MySQL会将DATE值转换回字符串表示形式,并将其转换回字符串表示形式(以MySQL默认格式)。

为了说明在date是字符列的情况下为什么“没有变化”,请考虑:

SELECT DATE('2018/04/12')                             AS dt
     , DATE_FORMAT( DATE('2018/04/12') ,'%Y/%m/%d')   AS str

返回

dt          str
----------  ----------
2018-04-12  2018/04/12

我不确定是否有任何回答问题的答案。我甚至不确定是否有问题。