Обновление MySQL, если существует, вставьте - PullRequest
0 голосов
/ 05 апреля 2011

У меня есть таблица архивных значений для каждого channel_id, но я также хочу сохранить текущее значение для каждого channel_id доступным.Сначала я попытался поместить его в отдельную таблицу, но использование объединения таблиц для каждого запроса на выбор было невероятно медленным (я рассмотрел объединение двух таблиц).

Итак, я думаю, что лучшая альтернатива - сохранить ее в таблице архивных данных с дополнительным столбцом, чтобы указать, является ли это текущим значением?

Мой вопрос заключается в том, как добавить текущее значение в эту таблицу, если строка не существует с одинаковым значением channel_id и текущим столбцом, равным 1, и обновить его, если оно существует?

Я не вижу способа сделать уникальный индекс, который ссылается как на channel_id, так и на текущий, так как многие channel_ids будут иметь current = 0. Так что замена не будет работать.И обновление не всегда будет работать, потому что строка еще может не существовать.

Есть ли лучшее решение?В таблице будут миллионы записей, и будут сотни тысяч channel_ids.

EDIT

CREATE TABLE `data` (
`date_time` decimal(26,6) NOT NULL,
`channel_id` mediumint(8) unsigned NOT NULL,
`value` varchar(40) DEFAULT NULL,
`status` tinyint(3) unsigned DEFAULT NULL,
`connected` tinyint(1) unsigned NOT NULL,
`current` tinyint(1) unsigned DEFAULT NULL,
PRIMARY KEY (`channel_id`,`date_time`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


CREATE TABLE `current` (
`date_time` decimal(26,6) NOT NULL,
`channel_id` mediumint(8) unsigned NOT NULL,
`value` varchar(40) DEFAULT NULL,
`status` tinyint(3) unsigned DEFAULT NULL,
`connected` tinyint(1) unsigned NOT NULL,
PRIMARY KEY (`channel_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Это таблицы, с которыми я сейчас работаю.Я хотел бы либо найти хороший способ объединить их для запросов (в этом случае текущий столбец в таблице данных не нужен), либо просто использовать таблицу данных и для заданного channel_id найти одну строку для этого channel_id, который имеет текущий= 1, и если он существует, обновите его, указав новое значение date_time, value, status и connected.Если он не существует, добавьте его с теми же значениями.

Ответы [ 3 ]

3 голосов
/ 05 апреля 2011

Посмотрите на синтаксис ON DUPLICATE KEY UPDATE в MySQL

http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

1 голос
/ 05 апреля 2011
0 голосов
/ 06 апреля 2011

Вы абсолютно можете создать составной ключ UNIQUE.

CREATE UNIQUE INDEX ON table_name ( `channel_id`, `current` );

Затем, для других ответов, вы можете использовать REPLACE или ON DUPLICATE для обновления. Очевидно, что это ужасная идея, и преобразование таблицы, вероятно, должно произойти, но это сработает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...