当我创建一个带有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").
时间戳列是一种特殊情况.请参见此处:默认情况下,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)
请注意重复的列名称.
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)