MySQL 以毫秒为单位存储 TIMESTAMP

标签 mysql sql

我需要创建一个数据库来存储一些每毫秒可能发生一次的日志。 我创建了下表:

CREATE TABLE `log` (
    `DataEvento` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
    `CodiceEvento` int(11) NOT NULL,
    `IdApplicativo` int(11) NOT NULL,
    PRIMARY KEY (`DataEvento`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

还有一个存储过程:

CREATE DEFINER=`root`@`localhost` PROCEDURE `ScriviEvento`(IN evt_id INT, IN app_id INT, IN evt_descr TEXT)
BEGIN
    DECLARE timestamp_now TIMESTAMP(3) DEFAULT NOW(3);
    INSERT INTO log (DataEvento, CodiceEvento, IdApplicativo) VALUES (timestamp_now, evt_id, app_id);
    IF (LENGTH(evt_descr) > 0) THEN
        INSERT INTO descrizionelog (DataEvento, DescrizioneEvento) VALUES (timestamp_now, evt_descr);
    END IF;
END

手动插入一些条目我得到正确的毫秒时间戳但是如果我创建一个线程 使用 Sleep(1) 我得到重复键错误,如果我在工作台中快速按下执行按钮,也会发生同样的情况

CALL(1, 0, '');

是否有解决方法(不包括使用自动递增 ID),还是我做错了什么?

最佳答案

您假设时间戳对于日志记录来说是唯一的,这是错误的。这真的没有意义。

我不确定您为什么反对自动增量解决方案。这将是正确的方法:

CREATE TABLE `log` (
    LogId int auto_increment primary key,
    `DataEvento` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
    `CodiceEvento` int NOT NULL,
    `IdApplicativo` int NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

关于MySQL 以毫秒为单位存储 TIMESTAMP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41430304/

相关文章:

PHP序列化函数-将序列化后的数据添加到mysql中,然后获取并显示

mysql - 如何在 Codeigniter 中绑定(bind)使用 LIMIT 参数变量的查询

不使用游标为每行调用 SQL 存储过程

php - 在 Redis 中存储数组的数组

php - 多个搜索词的搜索查询

php - 带有外连接的复杂 sql 查询

php - 如何从当前位置从数据库中获取信息?

java - 从 java.time.MonthDay 到 java.sql.* 的映射

php - 选择当天的最后一条记录

MySQL 大数据交叉引用查找