我有一张表,如下所示:
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 INSERT
和ON UPDATE
.
但是我没有在我的创建表中添加这样的指令。
为什么它不像其他列那样让它为空?
现在,在每次插入或更新另一列时,它都会添加当前时间戳。我不想要那个。
它不会对其他列执行此操作。我究竟做错了什么?
ype*_*eᵀᴹ 13
这是(第一)timestamp
列的默认行为。更多细节可以在文档中阅读:Automatic Initialization and Updateing forTIMESTAMP
.
如果你不想这样,你必须在创建表时明确告诉 MySQL。您可以声明一个默认值(或默认为空)并且自动属性将被抑制。以下任何一项都可以(解释了行为差异):
选项 1:not null
和default 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:null
和default 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
在列中插入,它也是允许的并且插入也很好(这里也不奇怪。)