草庐IT

mysql - 玛丽亚数据库/MySql : Setting CURRENT_TIMESTAMP on CREATE and changing noting on UPDATE

coder 2023-10-12 原文

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

然后created列设置为:
默认 CURRENT_TIMESTAMP 更新 CURRENT_TIMESTAMP

并且 modified 列设置为:
默认 '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));

然后我得到错误**错误代码:1293。不正确的表定义;在 DEFAULT 或 ON UPDATE 子句中只能有一个带有 CURRENT_TIMESTAMP 的 TIMESTAMP 列 **

那么有没有一种方法可以在创建行时自动设置 createdmodified ,然后在每次该行时更改 modified是变化吗?

提前致谢。

最佳答案

在旧版本的 MySQL 中,一张表可能只有一列自动初始化日期。但它的行为固定在 version 5.6.5. 中 这意味着您有几种方法可以避免此错误:

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


优点:

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

退步:

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

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

优点:

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

退步:

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

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

CREATE TABLE example_table (
  created TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
  updated_at TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP
);

如果执行以下查询:

INSERT INTO example_table (created) VALUES (null);

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

优点:

  • 没有多余的触发器

退步:

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

4.可以在updated列中使用date的自动初始化,使用trigger来填充created。例如:

CREATE TABLE example_table (
  created TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
  updated_at TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP
);

DELIMITER //
CREATE TRIGGER example_table_set_created_date
BEFORE INSERT
   ON example_table FOR EACH ROW
BEGIN
   SET NEW.created = CURRENT_TIMESTAMP();
END; //    
DELIMITER;

优点:

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

退步:

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

关于mysql - 玛丽亚数据库/MySql : Setting CURRENT_TIMESTAMP on CREATE and changing noting on UPDATE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54350419/

有关mysql - 玛丽亚数据库/MySql : Setting CURRENT_TIMESTAMP on CREATE and changing noting on UPDATE的更多相关文章

随机推荐