簡體   English   中英

一張表中的兩個 MySQL 時間戳列

[英]Two MySQL timestamp columns in one table

我想創建一個表,其中既有“created”列,又有“updated”列。 “創建”列將在插入時設置並且永遠不會更改。 每次更新行時,“已更新”列都會更改。 我不想在隨后的 INSERT 或 UPDATE 語句中弄亂這些列中的任何一個。 那么,如果我以這樣的方式開始,我的 CREATE TABLE 語句應該是什么樣子呢?

CREATE TABLE IF NOT EXISTS `mydb`.`mytable` (
  `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `updated` TIMESTAMP,
  `created` TIMESTAMP,
  `deleted` TINYINT DEFAULT 0,
  `notes` TEXT DEFAULT '',
  `description` VARCHAR(100)
) TYPE=innodb;

我似乎無法創建包含兩個 TIMESTAMP 列的表。 我不在乎這些列是 TIMESTAMP 還是 DATETIME 或其他什么,我只希望它們由 MySQL 填充,而不需要插入或更新語句的明確說明。

我希望能夠像這樣插入:

INSERT INTO `mydb`.`mytable` (notes,description) VALUES ('some note','some description');

和這樣的更新:

UPDATE `mydb`.`mytable` SET notes=CONCAT(notes,'some more notes') WHERE id=1;

兩者都無需在插入或更新語句中顯式設置“創建”列或設置(或重置)“更新”列。

試試這個來創建你的表:

CREATE TABLE IF NOT EXISTS db.test_table
(
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
created DATETIME DEFAULT NULL,
updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted TINYINT DEFAULT 0,
notes TEXT DEFAULT NULL,
description VARCHAR(100)
)

注意

updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

將允許自動更新此字段。

並在插入記錄之前將其設置為觸發器:

DELIMITER $$

CREATE
    /*[DEFINER = { user | CURRENT_USER }]*/
    TRIGGER `db`.`on_before_insert` BEFORE INSERT
    ON `db`.`test_table`
    FOR EACH ROW BEGIN
    SET new.created = NOW();    
    END$$

DELIMITER ;

然后你可以使用它來插入:

INSERT INTO db.test_table(description) VALUES ("Description")

並更新您的記錄

UPDATE db.test_table SET description = "Description 2" where Id=1

並且您創建和更新的字段將被適當地設置。

新聞 flash:在 mysql 中,每次更新行中的任何其他列時, TIMESTAMP列總是用now()更新 - 這是此數據類型的特意設計的特性。

另一方面, DATETIME沒有這種奇怪的行為 - 這是完全正常的。

答案: created必須是DATETIME ,但是由於這個錯誤,您還需要一個觸發器,如下所示:

CREATE TABLE IF NOT EXISTS mytable (
  `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `updated` TIMESTAMP, -- This will be updated to now(), if you don't set it or set it to null
  `created` DATETIME NOT NULL, -- This will never be magically updated once written
  `deleted` TINYINT DEFAULT 0,
  `notes` TEXT DEFAULT '',
  `description` VARCHAR(100)
) TYPE=innodb;

DELIMITER ~
CREATE TRIGGER mytable_insert_trigger
BEFORE INSERT ON mytable
FOR EACH ROW BEGIN
    SET NEW.created = CURRENT_TIMESTAMP;
END;~
DELIMITER ;

insert into mytable (notes) values ('test');
select * from mytable;
+----+---------------------+---------------------+---------+-------+-------------+
| id | updated             | created             | deleted | notes | description |
+----+---------------------+---------------------+---------+-------+-------------+
|  1 | 2011-07-05 11:48:02 | 2011-07-05 11:48:02 |       0 | test  | NULL        |
+----+---------------------+---------------------+---------+-------+-------------+

嘗試這個:

CREATE TABLE IF NOT EXISTS mydb.mytable
(
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    updated DATETIME,
    created TIMESTAMP,
    deleted TINYINT DEFAULT 0,
    notes TEXT DEFAULT '',
    description VARCHAR(100)
) TYPE=innodb;

編輯:使用觸發器。

CREATE TRIGGER mytable_update
BEFORE UPDATE ON mydb.mytable
    FOR EACH ROW SET NEW.updated = NOW();

另一種方法是更改時間戳列的順序

或者

像這樣設置第一列的默認值

ALTER TABLE `tblname` CHANGE `first_timestamp_column` 
     `first_timestamp_column` TIMESTAMP NOT NULL DEFAULT 0;

Reference

不幸的是 MySQL 不允許您在一張表中有兩個 TIMESTAMP 列。 我將使用 ON UPDATE CURRENT_TIMESTAMP 作為更新的列,並使用 NOW() function 手動創建設置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM