INSERT INTO ... 在重复密钥更新时

INSERT INTO ... ON DUPLICATE KEY UPDATE

我想将时间戳、parameter_id 和值记录到我的数据库中,使用时间戳和 parameter_id 作为主要的唯一键。

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?

编辑:问题:目前有一个错误,我从中获取数据,时间戳四舍五入为毫秒,分辨率为微秒,然后转换为纳秒格式。因此,如果情况不佳,两个不同的时间戳都会四舍五入为相同的值,这会导致重复的主键。

我找到了一个适用于两次相同时间戳的解决方案:

  • 将整个事情转移到存储过程中
  • 如果该行存在,则使用以下语句插入它:

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;

  • 然后在 table 中插入另一行内容相同,但插入忽略

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,但内容被保留。然后插入新行。

如果该行不存在,则在第一个语句中插入该行,第二个插入将被忽略,因为主键已经存在。