多列唯一键mysql插入

时间:2018-10-08 07:45:08

标签: mysql mariadb

我有一个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生成多个insert语句,购买在唯一键中添加page_id和date来实现这一点,但是我希望有所不同。 逻辑应该是:插入新行的unique_key(半唯一用户ID),其中country = this,date = this,page_id = this。如果已经存在包含此类信息的行(相同的page_id,unique_key和日期+国家/地区)-更新金额=(金额)+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(); 并且表格应根据是否存在相同的unique_key +日期+国家+平台+ page_id来知道是否存在重复项,否则只需插入新行。 现在,我通过使用不同的度量标准以及生成的已经包含date + page_id然后进行哈希处理的unique_key来进行不同的操作。这样,它的独特之处在于我可以每天过滤不同的唯一用户,但我无法过滤唯一用户的会话数量,或者他使用该软件及类似产品的时间。

1 个答案:

答案 0 :(得分:0)

首先在所有需要唯一的列上创建唯一索引,如下所示:

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查询来插入/更新。