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,但内容被保留。然后插入新行。
如果该行不存在,则在第一个语句中插入该行,第二个插入将被忽略,因为主键已经存在。
我想将时间戳、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,但内容被保留。然后插入新行。
如果该行不存在,则在第一个语句中插入该行,第二个插入将被忽略,因为主键已经存在。