MariaDB/MySql:在 CREATE 上设置 CURRENT_TIMESTAMP 并在 UPDATE 上更改注释

Int*_*lia 10 mysql mariadb

我已经有几年没有使用 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

提前致谢。

Max*_*rov 5

在旧版本的 MySQL 中,表可能仅在一列中自动初始化日期。但其行为在5.6.5 版本中得到修复。\n这意味着您有几种方法可以避免此错误:

\n\n

1.您可以将MySQL升级到最新版本;

\n\n
\n\n

优点:

\n\n
    \n
  • 在数据库端本地清晰地实现修改日期管理
  • \n
  • 没有多余的触发器
  • \n
\n\n

\xd0\x92rawback:

\n\n
    \n
  • 如果现有项目中使用当前版本的MySQL,则升级可能会出现一些问题。
  • \n
\n\n
\n\n

2.您可以创建触发器来更新和创建记录,正如@Simonare所说

\n\n

优点:

\n\n
    \n
  • 在数据库端实现修改日期管理
  • \n
\n\n

\xd0\x92rawback:

\n\n
    \n
  • 有很多多余的触发因素。您将为每个表创建两个触发器。这意味着您将为 N 个表创建 N*2 个触发器。
  • \n
\n\n
\n\n

created3.您可以将列的默认值设置为0000-00-00 00:00:00并将updated列的默认值设置为CURRENT_TIMESTAMP()在这种情况下,将自动生成更新日期。此外,如果您写入nullcreated,MySQL 将自动生成当前日期并将其设置到该列。例如:

\n\n
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
Run Code Online (Sandbox Code Playgroud)\n\n

如果执行以下查询:

\n\n
INSERT INTO example_table (created) VALUES (null);\n
Run Code Online (Sandbox Code Playgroud)\n\n

created列将具有当前日期值。MySQL会自动填充它。

\n\n

优点:

\n\n
    \n
  • 没有多余的触发器
  • \n
\n\n

\xd0\x92rawback:

\n\n
    \n
  • 在数据库端和客户端应用程序端实现修改日期管理
  • \n
\n\n
\n\n

4.可以使用自动初始化列中的日期updated并使用触发器来填充created。例如:

\n\n
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;\n
Run Code Online (Sandbox Code Playgroud)\n\n

优点:

\n\n
    \n
  • 在数据库端实现修改日期管理
  • \n
\n\n

\xd0\x92rawback:

\n\n
    \n
  • 有很多多余的触发因素。您将为 N 个表创建 N 个触发器。
  • \n
\n