2014-05-07 87 views
1

如果我创建一个表的实体,假设为DATE,当我Insert,并将该列保留空白不应该显示当前日期?与时间一样吗?INSERT当前日期或时间到MySQL

例如...

CREATE TABLE Register 
(
Name CHAR(20) NOT NULL, 
Date DATE, 
Time TIME 
); 

然后我插入:

INSERT INTO Register (Name) 
VALUES ('Howard'); 

我希望它显示在桌子上:

Howard | 5/6/2014 | 8:30 PM 

但相反,它显示:

Howard | NULL | NULL 

这是不正确的,如果是这样的话,我认为Insert允许插入的当前日期和时间显示?

+1

您需要在表上有默认约束。 –

+0

@mr_eclair,但不能单独设置默认日期和时间。 – JakeGould

回答

4

首先,你应该在你的表PRIMARY KEY

列的DateTime其次,您没有设置默认值。此外,您不能单独设置它们的DATETIME类型 - 你应该使用像TIMESTAMP类型和DEFAULT CURRENT_TIMESTAMP

CREATE TABLE Register (
    Name CHAR(20) PRIMARY KEY NOT NULL, 
    Date TIMESTAMP DEFAULT CURRENT_TIMESTAMP 
); 

第三,如果你想使用的日期恰好存放两列,您可以设置INSERT事件的触发此表,就像如下所示:

CREATE TRIGGER default_date_time 
BEFORE INSERT ON my_table_name 
FOR EACH ROW 
BEGIN 
    SET NEW.Date = CURDATE(); 
    SET NEW.Time = CURTIME(); 
END; 
$$ 
+0

触发器是一个体面的解决方案,但随着数据库结构的增长可能会有点抽象(即:令人困惑)。 – JakeGould

+1

@JakeGould:我认为这种方法对于OP的目的有点人为,然而,这取决于他。 'CURRENT_TIMESTAMP'方法对我来说似乎更优雅) – potashin

2

您需要设置默认值。所以你可能会认为你可以这样做:

CREATE TABLE Register 
(
Name CHAR(20) NOT NULL, 
Date DATE DEFAULT CURRENT_DATE, 
Time TIME DEFAULT CURRENT_TIME 
); 

但这不行。您需要使用CURRENT_TIMESTAMP和改变你的数据库结构,使用组合TIMESTAMP格式:

CREATE TABLE Register 
(
Name CHAR(20) NOT NULL, 
Timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP 
); 

之所以存在是有单独DATETIME没有mysql DEFAULT值。一些线索that behavior here

在数据类型规范的默认值子句表示为列一个 默认值。 有一个例外,默认值必须是 是一个常数;它不能是一个函数或表达式。这意味着,例如, ,例如,您不能将日期列的默认值设置为 函数的值,例如NOW()或CURRENT_DATE。 例外 是您可以指定CURRENT_TIMESTAMP作为默认值为 TIMESTAMP列。请参见第11.3.5节“自动初始化和 更新TIMESTAMP”。

2

这里有两种选择:

  1. 摆脱DateTime列,并添加time stamp

    INSERT INTO Register (Name,Ctime) VALUES ('Howard',CURRENT_TIMESTAMP);

  2. 如果你想继续你的表结构

    INSERT INTO Register (Name,日期,时间) VALUES ('Howard',CURDATE(), CURTIME());

另请注意,datetime是MySQL的保留字,因此应使用反引号引用以避免与保留字冲突。或者根据table name格式重新命名。

+0

CURRENT_TIMESTAMP解决我的问题,在我的.sql脚本中插入当前日期,我正在使用mysql 5.7.19 –