INSERT INTO ...在DUPLICATE KEY UPDATE

时间:2015-03-26 07:16:17

标签: mysql insert duplicates innodb

我想使用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?

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

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

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

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