6

我有如下所示的表格。为了解决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;

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

mysql> SELECT @@sql_mode;
+------------+
| @@sql_mode |
+------------+
|            | 
+------------+
1 row in set (0.00 sec)

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

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

我在 Ubuntu 上使用 MySQL 5.1.37

我该如何解决?谢谢。

4

4 回答 4

12

您只能有一个CURRENT_TIMESTAMP默认为或NOW()每个表的时间戳列。这是 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);

输出将显示:

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.

这是一个遗憾,因为在这种情况下使用触发器将是一个很好的解决方法。

于 2009-09-22T23:47:22.613 回答
7

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

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 ;
于 2011-05-24T01:23:12.167 回答
1

要做到这一点并让它发挥作用:

col1 TIMESTAMP DEFAULT 0,

col2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 

您不需要 col1 的触发器,只需确保查询中的值为 NULL。答案在认证指南中。

于 2012-08-29T14:44:10.267 回答
0

MySQL 5.6.1 之前的版本在同一个表中不支持默认 TIMESTAMP。

在 MySQL 5.6.+ 版本之后,它允许在同一个表中使用两个或更多 TIMESTAMP 列。

你可以尝试更新你的mysql版本

于 2017-04-14T07:22:11.643 回答