我已经有几年没有使用 MySQL 了,当我创建一个新表时,它做了一些我意想不到的事情。我正在使用MariaDB v5.5.60-MariaDB
我需要创建一个既有created列又有updated列的表。
我created只需要在创建行时将列设置为 CURRENT_TIMESTAMP,然后除非我显式更改它,否则永远不会更改。
我需要updated在创建行和更改行时将列设置为 CURRENT_TIMESTAMP。
如果我执行以下操作:
CREATE TABLE user_prefs (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE,
user VARCHAR(255) NOT NULL,
provider VARCHAR(255) NOT NULL,
pref VARCHAR(128) NOT NULL,
jsondata LONGTEXT,
created timestamp NOT NULL,
modified timestamp NOT NULL,
PRIMARY KEY (id),
UNIQUE INDEX id_UNIQUE (id ASC));
Run Code Online (Sandbox Code Playgroud)
然后created将该列设置为:
DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
并且该modified列设置为:
DEFAULT '0000-00-00 00:00:00'
如果我尝试这个:
CREATE TABLE user_prefs (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE,
user VARCHAR(255) NOT NULL,
provider VARCHAR(255) NOT NULL,
pref VARCHAR(128) NOT NULL,
jsondata LONGTEXT,
created timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
modified timestamp NOT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE INDEX id_UNIQUE (id ASC));
Run Code Online (Sandbox Code Playgroud)
然后我收到错误**错误代码:1293。表定义不正确;DEFAULT 或 ON UPDATE 子句中只能有一个带有 CURRENT_TIMESTAMP 的 TIMESTAMP 列 **
那么有没有一种方法可以在创建行时自动设置created和,然后在每次更改行时进行更改?modifiedmodified
提前致谢。
在旧版本的 MySQL 中,表可能仅在一列中自动初始化日期。但其行为在5.6.5 版本中得到修复。\n这意味着您有几种方法可以避免此错误:
\n\n1.您可以将MySQL升级到最新版本;
\n\n优点:
\n\n\xd0\x92rawback:
\n\n2.您可以创建触发器来更新和创建记录,正如@Simonare所说
\n\n优点:
\n\n\xd0\x92rawback:
\n\ncreated3.您可以将列的默认值设置为0000-00-00 00:00:00并将updated列的默认值设置为CURRENT_TIMESTAMP()。在这种情况下,将自动生成更新日期。此外,如果您写入null列created,MySQL 将自动生成当前日期并将其设置到该列。例如:
CREATE TABLE example_table (\n created TIMESTAMP NOT NULL DEFAULT \'0000-00-00 00:00:00\',\n updated_at TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP\n);\nRun Code Online (Sandbox Code Playgroud)\n\n如果执行以下查询:
\n\nINSERT INTO example_table (created) VALUES (null);\nRun Code Online (Sandbox Code Playgroud)\n\ncreated列将具有当前日期值。MySQL会自动填充它。
优点:
\n\n\xd0\x92rawback:
\n\n4.可以使用自动初始化列中的日期updated并使用触发器来填充created列。例如:
CREATE TABLE example_table (\n created TIMESTAMP NOT NULL DEFAULT \'0000-00-00 00:00:00\',\n updated_at TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP\n);\n\nDELIMITER //\nCREATE TRIGGER example_table_set_created_date\nBEFORE INSERT\n ON example_table FOR EACH ROW\nBEGIN\n SET NEW.created = CURRENT_TIMESTAMP();\nEND; // \nDELIMITER;\nRun Code Online (Sandbox Code Playgroud)\n\n优点:
\n\n\xd0\x92rawback:
\n\n| 归档时间: |
|
| 查看次数: |
12544 次 |
| 最近记录: |