2017-01-02 7 views
0

ミリ秒ごとに発生する可能性のあるログを保存するデータベースを作成する必要があります。ミリ秒でTIMESTAMPを格納するMySQL

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。 – IssamTP

+0

。 。もしオーバーフローが問題であれば 'LogId'に' bigint'を使うことができます。 –