2017-01-02 170 views
0

我需要创建一个数据库来存储一些可以每毫秒出现一次的日志。 我创建了如下表:MySQL以毫秒为单位存储TIMESTAMP

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 

手动插入一些条目我得到正确的时间戳和毫秒,但如果我创建一个线程 与睡眠( 1)我有重复键错误,如果我按在工作台上

CALL(1, 0, ''); 

快速执行按钮同样的情况,是否有解决方法这(不包括使用自动增量ID),还是我做错了什么?

回答

1

通过假设日志记录的时间戳将是唯一的,您在做错事。这真的没有道理。

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

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; 
+0

为什么时间戳不会是唯一的?此外:如果我使用自动增量这是溢出限制? – IssamTP

+0

@IssamTP。 。 。如果溢出是一个问题,你可以使用'bigint'作为'LogId'。 –