2015-03-26 5 views
-1

Я хочу записать timestamp, parameter_id и значение в мой db, используя временную метку и параметр_id в качестве основного уникального ключа.INSERT INTO ... ON DUPLICATE KEY UPDATE

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?

EDIT: Проблема: в настоящее время есть ошибка, из которой я получаю данные, временная метка округляется до миллисекунд с разрешением в микросекундах, а затем вводится в формате наносекунд. следовательно, если он идет плохо, то и РАЗНЫЕ временные метки округляются до одного значения, что приводит к дублированию первичного ключа.

+0

Я редактировал вопрос, чтобы дать вам некоторый фон. это ошибка, это было бы легко обходным путем. и он не имеет ничего общего с дублирующимися первичными ключами. –

ответ

0

Я нашел решение, которое работает в два раза тот же временной метки:

  • Transfer все это в хранимую процедуру
  • Если строка существует, вставить его со следующим утверждением:

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 нс назад, но содержание сохраняется. Затем после этого добавляется новая строка.

Если строка не существует, строка get добавляется в первый оператор, а вторая вставка игнорируется, поскольку первичный ключ уже существует.

Смежные вопросы