2012-09-05 30 views

回答

1

不,这是不可能的。然后这条语句会更新该行,如果它已经存在,那么你最终只会得到一条记录和松散的历史信息。您需要先更新旧记录(将end_date设置为当前日期),然后插入新记录(end_date为NULL)。

+0

谢谢,我会继续使用触发器来发生这种情况。正在考虑将两个表合并为1 – exussum

0

我有这种方法没有任何选择(但与插入/更新)的实现。 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)查询结果(;

  • 没有与start_ts比新的更大的纪录,OE
  • 这是第一用户的日志记录,需要进行更新,标志着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');