我有如下表所示的表格。为了解决MySQL的一个默认的 now 列限制,我使用了如图所示的提示here
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
指向here我的输出:
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
我该如何解决?感谢。
答案 0 :(得分: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.
这是一个无赖,因为在这种情况下使用触发器将是一个很好的解决方法。
答案 1 :(得分:7)
实际上,兰迪的代码被打破了。它不起作用,因为它是一个变异的触发器。您无法更新启动更新的表。例如,如果要更新表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 ;
答案 2 :(得分:1)
要做到这一点并让它发挥作用:
col1 TIMESTAMP DEFAULT 0,
col2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
您不需要col1的触发器,只需确保查询中的值为NULL。答案在认证指南中。
答案 3 :(得分:0)
在同一个表中的5.6.1之前的MySQL中不支持默认TIMESTAMP。
在MySQL 5.6。+版本之后,它允许在同一个表中有两个或更多TIMESTAMP列。
您可以尝试更新您的mysql版本