Два столбца типа 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;
к сожалению, MySQL не позволяет вам иметь два столбца метки времени в одной таблице. Я бы использовал при обновлении CURRENT_TIMESTAMP для обновленного столбца и установил созданный вручную с помощью функции NOW ().