我想使用timestamp和parameter_id作为主要的唯一键,将timestamp,parameter_id和value记录到我的数据库中。
data_togo, CREATE TABLE 'data_togo' (
'id_para' int(10) unsigned NOT NULL DEFAULT '0',
't_ns' bigint(20) unsigned NOT NULL DEFAULT '0',
'id_inst' smallint(6) NOT NULL DEFAULT '1',
'value' varchar(255) NOT NULL DEFAULT '',
'isanchor' tinyint(4) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY ('t_ns','id_para')
) ENGINE=InnoDB DEFAULT CHARSET=utf8
然而,在非常罕见的情况下,可能会出现具有不同值的重复主键的情况。
INSERT INTO data_togo (id_para, t_ns, id_inst, value, is_anchor) VALUES ...
是否可以保留两行并将第二个时间戳(纳秒,这无关紧要)更新为+1?
编辑:问题:目前有一个我从中获取数据的错误,时间戳以微秒分辨率四舍五入到毫秒,然后变为纳秒格式。因此,如果它变坏,两个不同的时间戳都会四舍五入到相同的值,这会导致重复的主键。
答案 0 :(得分:0)
我找到了一个适用于同一时间戳两倍的解决方案:
INSERT INTO edl_dw.data_togo (id_para, t_ns, id_inst, value, isanchor)
VALUES(@id_para, @t_ns, @id_inst, @value, @anchor)
ON DUPLICATE KEY UPDATE t_ns= @t_ns-1;
INSERT IGNORE edl_dw.data_togo (id_para, t_ns, id_inst, value, isanchor)
VALUES(@id_para, @t_ns, @id_inst, @value, @anchor);
如果该行已存在,则旧行时间戳将设置为1 ns,但内容将保留。然后在此之后插入新行。
如果该行不存在,则在第一个语句中插入行,并且第二个插入被忽略,因为主键已经存在。