mysql - 多列唯一键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 来做这件事。这样它是独一无二的,因为我可以每天过滤不同的唯一用户,但我无法过滤唯一用户拥有的会话数量,或者他使用软件和类似软件的时间。
解决方案
首先在所有需要唯一的列上创建唯一索引,如下所示:
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查询来插入/更新。
推荐阅读
- python - 如何将两个定义的功能重复 5 次?Python
- mysql - 获取两个日期时间段之间的数据库搜索结果
- excel - 使用未识别的 laravel 标题导入 Excel 文件
- jquery - 延迟jQuery中的点击功能
- ansible - 在 Ansible 中设置来宾操作系统自定义规范的参数
- javascript - babel-plugin-module-resolver 不适用于节点中的 eslint
- sql-server - 无法加载文件或程序集 Microsoft.SqlServer.SMO
- sql - 从 SQLPlus 运行 SQL 脚本失败时如何查看错误?
- javascript - 在不使用 async await 关键字的情况下等待 promise 的值?
- javascript - 修改函数以使名称也链接