为什么即使我没有指定任何内容,mysql 也会在插入/更新时添加默认时间戳?

Jim*_*Jim 6 mysql timestamp

我有一张表,如下所示:

CREATE TABLE SomeTable (  
    id int unsigned NOT NULL AUTO_INCREMENT,  
    status enum('broken','repaired') NOT NULL,  
    from datetime NOT NULL,  
    until datetime NOT NULL,  
    brought_in timestamp,  
    brought_by varchar(255) NOT NULL,  
    repair_status enum('unpayed', 'payed') DEFAULT NULL,  
    payed_when timestamp,    
    delivered_when timestamp,  
    primary key(id)    
);  
Run Code Online (Sandbox Code Playgroud)

当我创建表时,如果我做了SHOW CREATE TABLE然后我看到列brought_in被定义为具有当前时间戳ON INSERTON UPDATE.
但是我没有在我的创建表中添加这样的指令。
为什么它不像其他列那样让它为空?
现在,在每次插入或更新另一列时,它都会添加当前时间戳。我不想要那个。
它不会对其他列执行此操作。我究竟做错了什么?

ype*_*eᵀᴹ 13

这是(第一)timestamp列的默认行为。更多细节可以在文档中阅读:Automatic Initialization and Updateing forTIMESTAMP .

如果你不想这样,你必须在创建表时明确告诉 MySQL。您可以声明一个默认值(或默认为空)并且自动属性将被抑制。以下任何一项都可以(解释了行为差异):


选项 1:not nulldefault 0

brought_in timestamp NOT NULL DEFAULT 0,             -- option 1a

brought_in timestamp DEFAULT 0,                      -- option 1b
Run Code Online (Sandbox Code Playgroud)

这两个选项是相同的。该列被定义为NOT NULL并且具有默认值0。请注意,TIMESTAMP是有一个默认属性唯一的数据类型NOT NULL在对比与所有其它数据类型,并与ISO / ANSI标准。

如果您尝试NULL在列CURRENT_TIMESTAMP中插入,则会插入(令人惊讶的是,另一个 MySQL 功能。)


选项 2:nulldefault null

brought_in timestamp NULL DEFAULT NULL,              -- option 2a

brought_in timestamp NULL,                           -- option 2b
Run Code Online (Sandbox Code Playgroud)

这些是相同的,它们允许NULL(并且都导致默认值NULL。)

如果您尝试NULL在列中插入,则允许并正常插入(这里没有意外。)


选项 3:null和/default 0或其他一些常数

brought_in timestamp NULL DEFAULT 0,                 -- option 3a

brought_in timestamp NULL DEFAULT '2013-01-01',      -- option 3b
Run Code Online (Sandbox Code Playgroud)

这类似于选项 2,但具有不同的默认值。

如果您尝试NULL在列中插入,它也是允许的并且插入也很好(这里也不奇怪。)

  • 不敢相信这个答案没有更多的赞成票,+1。 (2认同)