当不想更新timestamp列时,就用timstamp列给他复制,如:
update yourtable set your_timestamp_col=your_timestamp_col,money=money+10;

解决方案 »

  1.   

    一个帮助TIMESTAMP 列类型提供了一种类型,通过它你可以以当前操作的日期和时间自动地标记 INSERT 或UPDATE 操作。如果一张表中有多个 TIMESTAMP 列,只有第一个被自动更新。 自动更新第一个 TIMESTAMP 列在下列任何条件下发生: 列值没有明确地在一个 INSERT 或 LOAD DATA INFILE 语句中被指定。 
    列值没有明确地在一个 UPDATE 语句中被指定,并且其它的一些列值已发生改变。(注意,当一个 UPDATE 设置一个列值为它原有值时,这将不会引起 TIMESTAMP 列的更新,因为,如果你设置一个列值为它当前值时,MySQL 为了效率为忽略更新。) 
    明确地以 NULL 设置 TIMESTAMP 列。 
    第一个列以外其它 TIMESTAMP 列,可以设置到当前的日期和时间,只要将该列赋值 NULL 或 NOW()。 任何 TIMESTAMP 列均可以被设置一个不同于当前操作日期与时间的值,这通过为该列明确指定一个你所期望的值来实现。这也适用于第一个 TIMESTAMP 列。这个选择性是很有用的,举例来说,当你希望 TIMESTAMP 列保存该记录行被新添加时的当前的日期和时间,但该值不再发生改变,无论以后是否对该记录行进行过更新: 当该记录行被建立时,让 MySQL 设置该列值。这将初始化该列为当前日期和时间。 
    以后当你对该记录行的其它列执行更新时,为 TIMESTAMP 列值明确地指定为它原来的值。 
    另一方面,你可能发现更容易的方法,使用 DATETIME 列,当新建记录行时以 NOW() 初始化该列,以后在对该记录行进行更新时不再处理它。 示例(译者注): mysql> CREATE TABLE `tA` (
        ->   `id` int(3) unsigned NOT NULL auto_increment,
        ->     `date1` timestamp(14) NOT NULL,
        ->     `date2` timestamp(14) NOT NULL,
        ->     PRIMARY KEY  (`id`)
        -> ) TYPE=MyISAM;
    Query OK, 0 rows affected (0.01 sec)mysql> INSERT INTO `tA` SET `id` = 1; 
    Query OK, 1 row affected (0.02 sec)# 没有明确地指定第一个 timestamp 列值,该列值被设为插入的当前时刻
    # 没有明确地指定其它的 timestamp 列值,MySQL 则认为插入的是一个非法值,而该列值被设为0mysql> INSERT INTO `tA` VALUES (2, NOW(), NULL);
    Query OK, 1 row affected (0.01 sec)mysql> SELECT * FROM `tA`;
    +----+----------------+----------------+
    | id | date1          | date2          |
    +----+----------------+----------------+
    |  1 | 20030503104118 | 00000000000000 |
    |  2 | 20030503104254 | 20030503104254 |
    +----+----------------+----------------+
    2 rows in set (0.00 sec)mysql> UPDATE `tA` SET `id` = 3 WHERE `id` = 1;
    Query OK, 1 row affected (0.01 sec)
    Rows matched: 1  Changed: 1  Warnings: 0# 对某一记录行进行了更新,第一个 timestamp 列值也将被更新mysql> UPDATE `tA` SET `id` = 2 WHERE `id` = 2;
    Query OK, 0 rows affected (0.00 sec)
    Rows matched: 1  Changed: 0  Warnings: 0# MySQL 忽略了这次操作,第一个 timestamp 列值不会被更新mysql> SELECT * FROM `tA`;
    +----+----------------+----------------+
    | id | date1          | date2          |
    +----+----------------+----------------+
    |  3 | 20030503104538 | 00000000000000 |
    |  2 | 20030503104254 | 20030503104254 |
    +----+----------------+----------------+
    2 rows in set (0.00 sec)mysql> UPDATE `tA` SET `id` = 1,`date1`=`date1` WHERE `id` = 3;
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0# 明确地指定了第一个 timestamp 列值为它原有值,该值将不会被更新mysql> SELECT * FROM `tA`;
    +----+----------------+----------------+
    | id | date1          | date2          |
    +----+----------------+----------------+
    |  1 | 20030503104538 | 00000000000000 |
    |  2 | 20030503104254 | 20030503104254 |
    +----+----------------+----------------+
    2 rows in set (0.00 sec)* 以上结果在 MySQL 4.0.12 中测试示例结束(译者注) TIMESTAMP 值可以从 1970 到 2037 之间的任一时刻,精度为一秒。其值作为数字显示。 MySQL 检索与显示 TIMESTAMP 值的格式取决于它的显示尺寸,描述如下表。“完整”的 TIMESTAMP 格式是 14 位的,但是 TIMESTAMP 列可以以一个更短的显示尺寸建立: 列类型  显示格式  
    TIMESTAMP(14)  YYYYMMDDHHMMSS  
    TIMESTAMP(12)  YYMMDDHHMMSS  
    TIMESTAMP(10)  YYMMDDHHMM  
    TIMESTAMP(8)  YYYYMMDD  
    TIMESTAMP(6)  YYMMDD  
    TIMESTAMP(4)  YYMM  
    TIMESTAMP(2)  YY  所有的 TIMESTAMP 列均有一个相同的存储尺寸,而不考虑显示尺寸的大小。最常见的显示尺寸为 6、8、12 和 14。你可以在表创建时指定一个任意的显示尺寸,但是值 0 或 比 14 大的值将会被强制定义为列长 14。在从 1 ~ 13 范围内的奇数会被强制为下一个更大的偶数。 例如(译者注): 字段定义  强制字段长度  
    TIMESTAMP(0)  TIMESTAMP(14)  
    TIMESTAMP(15)  TIMESTAMP(14)  
    TIMESTAMP(1)  TIMESTAMP(2)  
    TIMESTAMP(5)  TIMESTAMP(6)  注意:从 MySQL 4.1 开始,TIMESTAMP 以 'YYYY-MM-DD HH:MM:DD' 格式作为字符串返回。不同的时间戳长度不再被支持。 译者注:如果你你希望在 MySQL 4.1 中以数字形式返回时间戳,则必须在该时间戳字段后加上 +0。从 MySQL 4.0.12 开始,选项 --new 可以被用来使服务器与 4.1 一样运作。 你可以使用常用的格式集中的任何一个指定 DATETIME、DATE 和 TIMESTAMP 值: 一个 'YYYY-MM-DD HH:MM:SS' 或 'YY-MM-DD HH:MM:SS' 格式的字符串。一个“宽松”的语法是被允许的:以任何标点符号作为日期部分和时间部分中的定界符。例如,'98-12-31 11:30:45'、'98.12.31 1+30+45'、'98/12/31 11*30*45' 和 '98@12@31 11^30^45' 均是等价的。 
    一个 'YYYY-MM-DD' 或 'YY-MM-DD' 格式的字符串。这里,一个“宽松”的语法同样也是被允许的:例如,'98.12.31'、'98-12-31'、'98/12/31' 和 '98@12@31' 是等价的。 
    一个无定界符的 'YYYYMMDDHHMMSS' 或 'YYMMDDHHMMSS' 格式的字符串,只要字符串看起来像是一个日期。例如,'19970523091528' 和 '970523091528' 均被解释为 '1997-05-23 09:15:28',但是 '971122129015' 却是违法的(它的分部分是无意义的),该值被插入时将变成 '0000-00-00 00:00:00'。 
    一个无定界符的 'YYYYMMDD' 或 'YYMMDD' 格式的字符串,只要字符串看起来像是一个日期。例如,'19970523' 和 '970523' 被解释成为 '1997-05-23',但是 '971332' 却是违法的(它的月和日部分是无意义的),该值被插入时将变成 '0000-00-00'。 
    一个 YYYYMMDDHHMMSS 或 YYMMDDHHMMSS 格式的数字,只要数字看起来像是一个日期。例如,19830905132800 和 830905132800 被解释成为 '1983-09-05 13:28:00'。 
    一个 YYYYMMDD 或 YYMMDD 格式的数字,只要数字看起来像是一个日期。例如,19830905 和 830905 被解释成为 '1983-09-05'。 
    在一个 DATETIME、DATE 或 TIMESTAMP 语境中,一个函数的返回值将随之而变化,例如 NOW() 或 CURRENT_DATE。 
    非法的 DATETIME、DATE 或 TIMESTAMP 值将会被转换到适当形式的“零”值('0000-00-00 00:00:00'、'0000-00-00' 或 00000000000000)。 对于以字符串格式指定的包含日期定界符的值,不必要为小于 10 的月或天的值指定 2 位数字。'1979-6-9' 等同于 '1979-06-09'。同样的,对于以字符串指定的包含时间定界符的值,不必要为小于 10 的时、分或秒指定 2 位数字。'1979-10-30 1:2:3' 等同于 '1979-10-30 01:02:03'。 以数字指定的值应该是 6、8、12 或 14 位长。如果数字是 8 或 14 位长的,该值将被假定为年份是由头 4 位数字给出的 YYYYMMDD 或 YYYYMMDDHHMMSS 格式。如果数字是 6 或 12 数字长,它将被假定为年份是由头 2 位数字给出的 YYMMDD 或 YYMMDDHHMMSS 格式。不是这些长度之一的数字通过在值前补零到最接近的长度后解释。 以没有定界符的字符串格式指定的值通过它们给出的长度来解释。如果字符串是 8 或 14 个字符长,则假定年份由前 4 个字符给出。否则,年份由前 2 个字符给出。对于字符串中出现的多个部分,字符串以从左到右的顺序被解释,以找出年、月、日、时、分和秒值。这就意味着,你不就使用少于 6 个字符的字符串。例如,如果指定 '9903' ,你可能认为它代表 1999年3月,但你将会发现MySQL 会将一个“零”值插入到你的表中。这是因为,年份和月份分别为 99 和 03,但是日期部分丢失(为 0),因此这个值是不合法的。 TIMESTAMP 列总是以完全精度存储给定的合法值,而不考虑显示尺寸的大小。这包含几个含义: 赋值时总是给出年、月和日,即使你的列类型定义为 TIMESTAMP(4) 或 TIMESTAMP(2)。否则,该值将是不合法的,而被 0 代替存储。 
    示例(译者注): 
      

  2.   


    mysql> CREATE TABLE `tA` (
        ->   `id` int(3) unsigned NOT NULL auto_increment,
        ->     `date1` timestamp(4) NOT NULL,
        ->     PRIMARY KEY  (`id`)
        -> ) TYPE=MyISAM;
    Query OK, 0 rows affected (0.01 sec)mysql> INSERT INTO `tA` (`id`,`date1`)
        ->  VALUES (1,NULL),  # 插入当前日期和时间
        ->         (2,0305),  # 以数字格式给出值,而值长度小于 6 ,在最左边补 0 至 6 位数字
        ->         (3,'0305');# 以字符串格式给出值,而值长不包括年、月和日,因而是一个非法值
    Query OK, 3 rows affected (0.01 sec)
    Records: 3  Duplicates: 0  Warnings: 1mysql> SELECT * FROM `tA`;
    +----+-------+
    | id | date1 |
    +----+-------+
    |  1 |  0305 |
    |  2 |  0003 |
    |  3 |  0000 |
    +----+-------+
    3 rows in set (0.00 sec)* 以上结果在 MySQL 4.0.12 中测试示例结束(译者注) 如果以 ALTER TABLE 拓展一个 TIMESTAMP 窄列,以前被“隐蔽”的信息将被显示出来。 
    示例(译者注): * 接上例结果mysql> ALTER TABLE `ta` CHANGE `date1` `date1` TIMESTAMP(11);
    Query OK, 3 rows affected (0.01 sec)
    Records: 3  Duplicates: 0  Warnings: 0# 设置 `date1` 为 TIMESTAMP(11),MySQL 会自动将其转化为 TIMESTAMP(11)mysql> SELECT * FROM `tA`;
    +----+--------------+
    | id | date1        |
    +----+--------------+
    |  1 | 030503150142 |
    |  2 | 000305000000 |
    |  3 | 000000000000 |
    +----+--------------+
    3 rows in set (0.00 sec)* 以上结果在 MySQL 4.0.12 中测试示例结束(译者注): 同样的,缩小一个 TIMESTAMP 列的宽度不会引起信息的丢失,除了在感觉上值在被显示时显示了较少的信息。 
    尽管 TIMESTAMP 列值是以全部精度存储的,但是 UNIX_TIMESTAMP() 是唯一能直接操作内部存储值的函数。其它的函数操作的是格式化后的检索的值。这就意味着不能够使用诸如 HOUR() 或 SECOND() 之类的函数,除非相关部分存在于格式化后的 TIMESTAMP 值中。例如,在小于 10 的显示格式上,为了使 TIMESTAMP 列中的 HH 部分能够显示,显示格式的尺寸必须不小于 10,因此在一个更短的 TIMESTAMP 列值上使用 HOUR() 将会产生一个无意义的结果。 
    示例(译者注): * 接上例结果
    # 下列示例结果与上述结果相悖
    mysql> ALTER TABLE `ta` CHANGE `date1` `date1` TIMESTAMP(4);
    Query OK, 3 rows affected (0.02 sec)
    Records: 3  Duplicates: 0  Warnings: 0mysql> SELECT * FROM `tA`;
    +----+-------+
    | id | date1 |
    +----+-------+
    |  1 |  0305 |
    |  2 |  0003 |
    |  3 |  0000 |
    +----+-------+
    3 rows in set (0.01 sec)mysql> SELECT HOUR(`date1`) FROM `tA`;
    +---------------+
    | Hour(`date1`) |
    +---------------+
    |            15 |
    |             0 |
    |          NULL |
    +---------------+
    3 rows in set (0.02 sec)mysql> SELECT SECOND(`date1`) FROM `tA`;
    +-----------------+
    | second(`date1`) |
    +-----------------+
    |              42 |
    |               0 |
    |            NULL |
    +-----------------+
    3 rows in set (0.01 sec)* 以上结果在 MySQL 4.0.12 中测试示例结束(译者注): 在某种程序上,你可以将一个日期值赋给另一种日期类型的对象。然而,这可能会使值产生改变或丢失一部分信息。 如果将一个 DATE 值赋给一个 DATETIME 或 TIMESTAMP 对象,结果值的时间部分将被设为 '00:00:00',因为 DATE 值不包含时间信息。 
    如果将一个 DATETIME 或 TIMESTAMP 值赋给一个 DATE 对象,结果值的时间部分被删除,因为 DATE 类型不能存储时间信息。 
    记住,尽管 DATETIME、DATE 和 TIMESTAMP 值全都可以用同样的格式集来指定,但所有类型不都有同有同样的值范围。例如,TIMESTAMP 值不能早于 1970 或晚于 2037。这就意味着,一个日期例如 '1968-01-01',作为一个 DATETIME 或 DATE 值是合法的,但不是一个有效的 TIMESTAMP 值,当它被赋于一个这样的对象时,它将被转换为 0。 
    当指定日期值时,当心某些失误: 你可能会被以字符串指定值时所允许的宽松格式欺骗。例如,一个值如 '10:11:12' 的,因为分界符 “:” 可能看起来像是一个时间值, 但是当它被用于一个日期语境中时,它将被解释成为 '2010-11-12' 年。而值 '10:45:15' 将被转换成 '0000-00-00',因为 '45' 是一个不合法的月份。 
    MySQL 服务器仅对日期的有效性执行基本的检验:天为 00-31,月为 00-12,年为 1000-9999。任何不是这个范围内的日期将被转换为 0000-00-00。请注意,这仍然允许你存储一个无效的日期例如2002-04-31。它允许一个 WEB 应用程序不进行进一步的检查而存储一个表单中的数据。为了确保一个日期值的有效性,在你的应用程序里执行有效性检查。 
    以两位数字指定年份是存在二义性的,因为世纪是未知的。MySQL 以下面的规则解释一个 2 位年份值: 
    00-69 范围的年份值被转换为 2000-2069。 
    70-99 范围的年份值被转换为 1970-1999。
      

  3.   

    1. 建立第二个timestamp 字段,系统不会对它更新。
    2. 用DATETIME 类型代替TIMESTAMP