我期待有MySQL句柄慢慢改变尺寸 该表设置为使用'生效日期'作为控制 - 所以表结构与此处类似http://en.wikipedia.org/wiki/Slowly_changing_dimension类型II底部示例。MySQL缓慢改变尺寸SCD2 +开复制关键更新
是否可以使用该功能来更新/插入或者是它最好单独的功能如插入=检查现有的再插入,更新=更新原始列,插入新列
感谢
我期待有MySQL句柄慢慢改变尺寸 该表设置为使用'生效日期'作为控制 - 所以表结构与此处类似http://en.wikipedia.org/wiki/Slowly_changing_dimension类型II底部示例。MySQL缓慢改变尺寸SCD2 +开复制关键更新
是否可以使用该功能来更新/插入或者是它最好单独的功能如插入=检查现有的再插入,更新=更新原始列,插入新列
感谢
不,这是不可能的。然后这条语句会更新该行,如果它已经存在,那么你最终只会得到一条记录和松散的历史信息。您需要先更新旧记录(将end_date设置为当前日期),然后插入新记录(end_date为NULL)。
我有这种方法没有任何选择(但与插入/更新)的实现。 MySQL的:5.7 这里是表结构:
CREATE TABLE UserStatusLog (
`user_id` int(11) NOT NULL,
`status_type` tinyint(8) NOT NULL, // we are logging multiple statuses in one table
`status_value` int(11) NOT NULL, // actual value of the status
`is_last` tinyint(1) DEFAULT '1', // marking flag
`start_ts` timestamp NOT NULL DEFAULT '1970-01-01 00:00:01', // when this status_value became actual
`finish_ts` timestamp NOT NULL DEFAULT '2030-01-01 00:00:00', // end of actuality for this status
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, // just for logging
`updated` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, // just for logging
PRIMARY KEY (`user_id`,`status_type`,`finish_ts`),
UNIQUE KEY `uniq` (`user_id`,`status_type`,`is_last`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
我们正试图插入新值登录:
INSERT IGNORE INTO UserStatusLog
(user_id, status_type, status_value, is_last, start_ts, finish_ts)
VALUES ($user_id, $type, $value, NULL, '2017-12-08 15:45:34', '2030-01-01 00:00:00')
ON DUPLICATE KEY UPDATE is_last = IF(start_ts < '2017-12-08 15:45:34' && status_value != VALUES(status_value),
2 /* THIS IS A "SPECIAL VALUE" for is_last */
, is_last);
然后,我们通过比较mysql_affected_rows)查询结果(;
这是第一用户的日志记录,需要进行更新,标志着is_last此记录:
UPDATE UserStatusLog SET is_last = 1 WHERE user_id = $ user_id AND status_type = $ type AND finish_ts ='2030-01-01 00:00:00'LIMIT 1;
有一个纪录,比新start_ts长老,我们已经与is_last = 2(特惠)更新它:
UPDATE test.mock_20171208_47d9ac21808ee65d605ca32205888648 SET is_last = NULL,finish_ts ='2017-12-08 15:45:45' WHERE user_id = $ user_id AND status_type = $ type AND is_last = 2 LIMIT 1; //插入新的,真正的最后一条记录 INSERT INTO test.mock_20171208_47d9ac21808ee65d605ca32205888648 (USER_ID,status_type,STATUS_VALUE,is_last,start_ts,finish_ts) VALUES ($ USER_ID,$型,$价值$ is_last = 1,“2017- 12-08 15:45:45','2030-01-01 00:00:00');
谢谢,我会继续使用触发器来发生这种情况。正在考虑将两个表合并为1 – exussum