2017-01-02 171 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'。 –