我已经有几年没有使用 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 列 **
那么有没有一种方法可以在创建行时自动设置 created 和 modified ,然后在每次该行时更改 modified是变化吗?
提前致谢。
最佳答案
在旧版本的 MySQL 中,一张表可能只有一列自动初始化日期。但它的行为固定在 version 5.6.5. 中 这意味着您有几种方法可以避免此错误:
1.您可以将您的MySQL升级到最新版本;
优点:
退步:
2.正如@Simonare 所说,您可以创建用于更新和创建记录的触发器
优点:
退步:
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;
优点:
退步:
关于mysql - 玛丽亚数据库/MySql : Setting CURRENT_TIMESTAMP on CREATE and changing noting on UPDATE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54350419/