MySQL两列时间戳默认NOW值ERROR 1067

Gok*_*mir 6 mysql database default-value mysql-error-1067

我有桌子如下图所示.为了要解决一个默认现在的MySQL列限制我使用的尖端如图这里

CREATE  TABLE IF NOT EXISTS mytable (
  id INT NOT NULL AUTO_INCREMENT ,
  create_date TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00' ,
  update_date TIMESTAMP NULL DEFAULT NOW() ON UPDATE NOW() ,
  PRIMARY KEY (`parti_id`) )
ENGINE = InnoDB;
Run Code Online (Sandbox Code Playgroud)

我的sql_mode不包括NO_ZERO_DATE如指出这里我的输出:

mysql> SELECT @@sql_mode;
+------------+
| @@sql_mode |
+------------+
|            | 
+------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

它仍然给出如下所示的错误:

ERROR 1067 (42000) at line xx in file: '/myschema.sql': Invalid default value for 'create_date'
Run Code Online (Sandbox Code Playgroud)

我在Ubuntu上使用MySQL 5.1.37

我该如何解决?谢谢.

ran*_*omx 12

您只能有一个默认为CURRENT_TIMESTAMPNOW()每个表的时间戳列.这是MySQL中一个众所周知的错误.

要解决此问题,请将创建列的默认值设置为有效的时间戳值,然后在CRUD应用程序代码中插入时间戳.使用NOW()CURRENT_TIMESTAMP更新列的默认值.

参考资料:http: //dev.mysql.com/doc/refman/5.1/en/timestamp.html

为了进一步说明MySQL在这方面的缺点,请考虑以下代码:

CREATE TABLE testing_timestamps (
  id INT NOT NULL AUTO_INCREMENT,
  pk_id INT NOT NULL,
  col1 TIMESTAMP DEFAULT 0,
  col2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY(id)
);

delimiter $$
CREATE TRIGGER testing_timestamps_trigger
  AFTER INSERT ON testing_timestamps
  FOR EACH ROW 
  BEGIN
    UPDATE testing_timestamps SET col1 = NOW() WHERE id = MAX(id);
  END;
$$
delimiter ;

INSERT INTO testing_timestamps (id) VALUES (0);
Run Code Online (Sandbox Code Playgroud)

此输出将显示:

mysql> INSERT INTO testing_timestamps (id) VALUES (0);
ERROR 1442 (HY000): Can't update table 'testing_timestamps' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
Run Code Online (Sandbox Code Playgroud)

这是一个无赖,因为在这种情况下使用触发器将是一个很好的解决方案.

  • 从MySQL 5.6.5开始,此限制[已被解除](http://optimize-this.blogspot.com/2012/04/datetime-default-now-finally-available.html). (4认同)

小智 7

实际上,兰迪的代码被打破了.它不起作用,因为它是一个变异的触发器.您无法更新启动更新的表.例如,如果要更新表SESSIONS,则无法使用UPDATE,INSERT或DELETE语句修改触发器中的表.允许您修改附加触发器的表的唯一方法是使用"NEW"或"OLD"前缀,如下所示.(当然,您可以随意更新其他表.)以下是如何克服op描述的问题的示例.

create table sessions (
    id integer not null,
    created timestamp not null default 0,
    updated timestamp not null default 0
);

delimiter //
create trigger bifer_sessions_ts before insert on sessions for each row
begin
    set new.created = now();
    set new.updated = now();
end;
//
create trigger bufer_sessions_ts before update on sessions for each row
begin
    set new.updated = now();
end;
//
delimiter ;
Run Code Online (Sandbox Code Playgroud)