几年来我没有使用过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
?
谢谢。
答案 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:
2。您可以创建触发器以更新和创建记录,如@Simonare所说
优势:
Вrawback:
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: