我有如下所示的表格。为了解决一个默认问题nowMySQL的列限制我使用了如图所示的提示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
我该如何修复它?谢谢。
你只能有one时间戳列默认为CURRENT_TIMESTAMP
or NOW()
每张桌子。这是 MySQL 中一个众所周知的错误。
为了解决这个问题,请将创建的列的默认值设置为有效的时间戳值,然后将时间戳插入到 CRUD 应用程序代码中。
使用NOW()
or 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.
这是一个令人遗憾的事情,因为在这种情况下使用触发器将是一个很好的解决方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)