mysql中的timestamp和datetime

今天在navicat mysql创建表的时候报错”1294 - Invalid ON UPDATE clause for ‘lastEditDate’ column”:

后来才知道是因为timestamp的默认值是不能为空的,这里我们取系统当前时间CURRENT_TIMESTAMP(3)

以下参考自:http://lavasoft.blog.51cto.com/62575/280284

TIMESTAMP

  1. TIMESTAMP列必须有默认值,默认值可以为’0000-00-00 00:00:00’,但不能为null

  2. TIMESTAMP列不可以设置值,只能由数据库自动去修改

  3. 一个表可以存在多个TIMESTAMP列,但只有一个列会根据数据更新而改变数据库系统当前值(默认是第一个TIMESTAMP列),因此,一个表中有多个TIMESTAMP列,是没有一意义的,实际上一个表只设定一个TIMESTAMP列。

  4. TIMESTAMP列的默认值是CURRENT_TIMESTAMP常量值,当记录数据发生变化的时候,TIMESTAMP列会自动将其值设定为CURRENT_TIMESTAMP。

  5. TIMESTAMP列创建后的格式是:语句含义是,lastEditDate字段的默认值是CURRENT_TIMESTAMP,当纪录更新时候,自动将lastEditDate字段的值设置为CURRENT_TIMESTAMP。

    1
    lastEditDate timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP
  6. 另外,下面的定义从语法角度是对的,但是没有意义,因为该字段的值不可更改,永远只能为默认值

    1
    lastEditDate timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'

DATETIME

  1. DATETIME列可以设置为多个,默认可为null,可以手动设置其值
  2. DATETIME列不可设置默认值
  3. DATETIME列可以变相设置默认值,例如:通过触发器. 或者插入数据时,将DATETIME字段值设置为now(),这样可以做到了。一般创建表时用datetime,更新时用timestamp