我需要创建一个数据库来存储一些每毫秒可以发生一次的日志。 我创建了下表:
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),或者我做错了什么?
答案 0 :(得分: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;