Два столбца типа timestamp в MySQL в одной таблице

Я хотел бы создать таблицу, которая имеет как столбец для "created", так и другой для "updated". Столбец "created" будет установлен в insert и никогда не изменится. Столбец "обновлено" будет меняться при каждом обновлении строки. Я не хочу связываться ни с одним из этих столбцов в последующих инструкциях 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. Мне все равно, являются ли столбцы меткой времени или DATETIME или что-то еще, я просто хочу, чтобы они были заполнены MySQL без явных инструкций из инструкций insert или update.

Я хотел бы иметь возможность делать вставки, как это:

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

и обновления такой:

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

оба без необходимости явно устанавливать столбец " created "или устанавливать (или сбрасывать) столбец" updated " в инструкции insert или update.

5 ответов


попробуйте этот, чтобы создать таблицу:

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

и ваши созданные и обновленные поля будут установлены соответственно.


попробуйте это:

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();

новость: в 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        |
+----+---------------------+---------------------+---------+-------+-------------+

альтернативой является изменение порядка столбца метки времени

или

установить значение по умолчанию первого столбца, как это

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

Reference


к сожалению, MySQL не позволяет вам иметь два столбца метки времени в одной таблице. Я бы использовал при обновлении CURRENT_TIMESTAMP для обновленного столбца и установил созданный вручную с помощью функции NOW ().