我最近决定停止使用MySQL的触发器我created和modified约会在我的表中的字段因并发症时运行脚本包括在客户端部署的安装文件.
我用这种方式改变了字段:(例子)
alter table users
modify `created` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00'
alter table users
modify `modified` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP
Run Code Online (Sandbox Code Playgroud)
当我现在运行我的程序并填写一个表单来添加数据(表单控件是数据绑定)时,我得到消息"列'创建'不允许空值".
在现有数据上,当我尝试更新时,修改日期根本不会改变.
我查看了许多文章,例如在MySQL 4.0中同时拥有Created和Last Updated时间戳列但无法找到解决方案.
我该如何解决这个问题?
我正在使用MySQL v 5.6.15.0
ALTER TABLE 'my_table'\nCHANGE `created` TIMESTAMP DEFAULT 0,\nCHANGE `modified` TIMESTAMP ON UPDATE CURRENT_TIMESTAMP\nRun Code Online (Sandbox Code Playgroud)\n但请确保在创建和更新操作期间为创建和修改提供任何值。
\n这是一个例子:
\nmysql> CREATE TABLE ts_test5 (\n-> created TIMESTAMP DEFAULT 0,\n-> updated TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n-> data CHAR(30)\n-> );\nQuery OK, 0 rows affected (0.01 sec)\n\nmysql> INSERT INTO ts_test5 (created, data)\n-> VALUES (NULL, \xe2\x80\x98original_value\xe2\x80\x99);\nQuery OK, 1 row affected (0.00 sec)\n\nmysql> SELECT * FROM ts_test5;\n+---------------------+---------------------+----------------+\n| created |updated |data | \n+---------------------+---------------------+----------------+\n| 2005-01-04 14:47:39 | 0000-00-00 00:00:00 | original_value |\n+---------------------+---------------------+----------------+\n1 row in set (0.00 sec)\n\nmysql> . . . time passes . . .\n\nmysql> UPDATE ts_test5 SET data=\xe2\x80\x99updated_value\xe2\x80\x99;\nQuery OK, 1 row affected (0.00 sec)\nRows matched: 1\nChanged: 1\nWarnings: 0\n\nmysql> SELECT * FROM ts_test5;\n+---------------------+---------------------+---------------+\n| created |updated |data |\n+---------------------+---------------------+---------------+\n| 2005-01-04 14:47:39 | 2005-01-04 14:47:52 | updated_value |\n+---------------------+---------------------+---------------+\n1 row in set (0.00 sec)\nRun Code Online (Sandbox Code Playgroud)\n
根据驱动程序的不同,0000-00-00 日期可能会被视为 null,这对于您的列定义无效。但如果情况并非如此,则1970 年之前的任何日期也都不是有效的时间戳。
我尝试将“创建”定义为 DATETIME 而不是 TIMESTAMP
alter table users modify `created` DATETIME NOT NULL DEFAULT '1000-01-01 00:00:00'
Run Code Online (Sandbox Code Playgroud)
(这是 DATETIME 可以采用的最小日期)。至于为什么修改后的列不起作用,这是同一问题的一部分。表应该只有一个时间戳列,但如果放置两个或更多,则只有第一个可以有 CURRENT_TIMESTAMP。愚蠢的 mysql 限制。
这个限制将在未来的版本中取消,但我猜你的还没有。