многоколонный уникальный ключ MySQL вставки - PullRequest
0 голосов
/ 08 октября 2018

У меня есть база данных mysql и структура таблиц, подобная этой:

CREATE TABLE `user_session_log` (
 `stat_id` int(8) NOT NULL AUTO_INCREMENT,
 `metric` tinyint(1) NOT NULL DEFAULT '0',
 `platform` tinyint(1) NOT NULL DEFAULT '0',
 `page_id` varchar(128) DEFAULT '_empty_',
 `target_date` date DEFAULT NULL,
 `country` varchar(2) DEFAULT NULL COMMENT 'ISO 3166 country code (2 symbols)',
 `amount` int(100) NOT NULL DEFAULT '0.000000' COMMENT 'counter or amount',
 `unique_key` varchar(180) DEFAULT NULL COMMENT 'Optional unique identifier',
 `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
 `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 PRIMARY KEY (`stat_id`),
 UNIQUE KEY `unique_key` (`unique_key`) USING BTREE,
 KEY `target_date` (`target_date`)
) ENGINE=InnoDB AUTO_INCREMENT=21657473 DEFAULT CHARSET=utf8

Я пытаюсь добиться регистрации активных сессий / уникальных пользователей на основе даты, page_id и страны.,В настоящее время я могу добиться этого, генерируя несколько операторов вставки с помощью unique_key, покупая добавляя page_id и дату в уникальном ключе, но я хочу что-то немного другое.Логика должна быть следующей: вставить новую строку unique_key (полууникальный идентификатор пользователя), где country = this, date = this, page_id = this.Если уже есть строка с такой информацией (тот же page_id, unique_key и date + country) - обновите сумму = (сумма) + 1;(Сессия).Так что я мог бы сделать поиск как:

SELECT sum(amount) WHERE page_id = "something" AND target_date = "2018-12-21" Это дало бы мне несколько сеансов.ИЛИ:

SELECT COUNT(*) WHERE page_id = "something" AND target_date = "2018-12-21" Это даст мне количество активных пользователей на этом pagee_id в этот день ИЛИ:

SELECT COUNT(*) WHERE target_date = "2018-12-21" , что даст мне общее количество пользователей за этот день.Я знаю об уникальном индексе, но даст ли он результат, который я ищу?


Правка, образец вставки: INSERT INTO `user_session_log` (`platform`,`page_id`,`target_date`,`country`,`amount`,`unique_key`,`created`,`modified`) VALUES ('1','page_id_54','2018-10-08','US',1,'ea3d0ce0406a838d9fd31df2e2ec8085',NOW(),NOW()) ON DUPLICATE KEY UPDATE `amount` = (amount) +1, `modified` = NOW(); и таблица должна знать, есть ли дубликат на основе того же уникального ключа + дата + страна + платформа + page_id, в противном случае просто вставьте новую строку.Прямо сейчас я делаю это по-другому, сгенерировав разные метрики и ключ unique_key, уже содержащий дату + page_id и затем хэшированный.таким образом, он уникален благодаря тому, что я могу фильтровать разных уникальных пользователей в течение дня, но я не могу отфильтровать количество сеансов, которые имел уникальный пользователь, или как долго он использует программное обеспечение и тому подобное.

1 Ответ

0 голосов
/ 08 октября 2018

Сначала создайте уникальный индекс для всех столбцов, которые должны быть уникальными, следующим образом:

ALTER TABLE user_session_log ADD UNIQUE INDEX idx_multi_column  ON user_session_log (unique_key, date, country, platform, page_id); 

, затем вы можете использовать INSERT ... ON DUPLICATE KEY UPDATE запрос для вставки /обновить.

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