首页 > 解决方案 > 多列唯一键mysql插入

问题描述

我有一个 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(半唯一用户id)的新行,其中country = this,date = this,page_id = this。如果已经有一行包含此类信息(相同的 page_id、unique_key 和 date + country) - 更新金额 = (amount) + 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 + date + country + platform + page_id 知道是否存在重复,否则只需插入一个新行。现在我通过不同的指标和一个已经包含 date + page_id 然后哈希生成的 unique_key 来做这件事。这样它是独一无二的,因为我可以每天过滤不同的唯一用户,但我无法过滤唯一用户拥有的会话数量,或者他使用软件和类似软件的时间。

标签: mysqlmariadb

解决方案


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

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


推荐阅读