是否可以定义一个非空的时间戳列,并且在更新时没有默认值且没有特殊行为?

adi*_*tsu 23 mysql timestamp

当我创建一个带有timestamp列的表时,该列在更新CURRENT_TIMESTAMP时被神奇地定义为NOT NULL DEFAULT CURRENT_TIMESTAMP.忽略到目前为止这有多奇怪,我想将其更改为没有默认值,也没有特殊的"on update"行为.

我发现如果我将列更改为NULL,默认情况下会神奇地设置为NULL,并且"on update"会神奇地消失.这很好,但我希望列不是NULL.当我将其更改回来时,默认和"on update"(设置为CURRENT_TIMESTAMP)都会神奇地重新出现.

我知道我可以使用datetime而不是timestamp,但我对时间戳感兴趣,因为它是时区感知的(似乎就像Postgres中的"timestamp with time zone").

Ili*_*ion 9

时间戳列是一种特殊情况.请参见此处:默认情况下,TIMESTAMP列为NOT NULL,不能包含NULL值,而赋值NULL则指定当前时间戳.

有关更详细的信息,请阅读数据类型默认值.

特别是当不在严格模式下运行时,这种情况适用.如果在严格模式下运行,插入NULL将引发错误.

这应该照顾它:

ALTER TABLE tableName ALTER COLUMN columnName DROP DEFAULT;
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,执行此操作应该保留默认值(轻松覆盖)但删除ON UPDATE:

ALTER TABLE tableName CHANGE columnName columnName NOT NULL DEFAULT CURRENT_TIMESTAMP;
Run Code Online (Sandbox Code Playgroud)

请注意重复的列名称.

  • 嗯,有趣。我能够做到这一点:`更改表tstest修改ts时间戳默认不为null默认值0;`之后:`更改表tstest更改列ts丢弃默认值;`这似乎可以提供我想要的结果。我想知道是否有更直接的方法,理想情况下是在create table语句中。 (2认同)

Bor*_*rov -1

这是一个可能的解决方法(如果由于某种原因当前无法选择更新架构): 禁用 ON UPDATE

基本上,您可以将时间戳值设置为其原始值,如下所示:

UPDATE my_table
  SET `the_value_that_i_am_updating`="The new value", 
      `changed_at`=`changed_at`;
Run Code Online (Sandbox Code Playgroud)