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

时间:2019-01-24 15:44:28

标签: 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));

然后将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

谢谢。

2 个答案:

答案 0 :(得分:1)

您可以为此创建触发器

DELIMITER //

CREATE TRIGGER user_prefs_before_insert
BEFORE INSERT
   ON user_prefs FOR EACH ROW

BEGIN
   SET NEW.updated = new.created;
END; //

DELIMITER ;

然后是另一个更新触发器

DELIMITER //

CREATE TRIGGER user_prefs_before_update
BEFORE UPDATE
   ON user_prefs FOR EACH ROW

BEGIN
   SET NEW.updated = CURRENT_TIMESTAMP();
END; //

DELIMITER ;

答案 1 :(得分:1)

在旧版本的MySQL中,表可能仅在第一列中具有日期的自动初始化。但其行为已固定在version 5.6.5.中 这意味着您可以通过多种方法来避免此错误:

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


优势:

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

Вrawback:

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

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

优势:

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

Вrawback:

  • 有许多多余的触发器。您将为每个表创建两个触发器。这意味着您将为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将自动填充它。

优势:

  • 没有多余的触发器

Вrawback:

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

4。您可以在updated列中使用日期的自动初始化,并使用触发器来填充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;

优势:

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

Вrawback:

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