我在日期列上有一个带有唯一键的数据库表,因此每个日期永远不会超过一行。如果我为数据库中已经存在的一天插入一个新行,我希望它将所有后续的连续日期推回一天,直到它到达“空闲”日。
这是我的想法:
INSERT INTO
`activity`
(`name`,`date`)
VALUES
('date 7','2009-07-31')
ON DUPLICATE KEY
UPDATE `date` = DATE_ADD(`date`, INTERVAL '1' DAY)
我的想法是 ON DUPLICATE KEY UPDATE 会使表格冒泡并不断在每个日期添加一天,直到它达到不存在的一天。
例如,如果我的表格内容如下所示:
date 1, 2009-07-30
date 2, 2009-07-31
date 3, 2009-08-01
date 4, 2009-08-02
date 5, 2009-08-04 <- notice this date is two days past the previous one
…我在 2009-07-31 插入“日期 7”,我希望它这样做:
date 1, 2009-07-30
date 7, 2009-07-31 <- newly inserted row
date 2, 2009-08-01 <- this and subsequent rows are all incremented
by one day until it hits a non-consecutive day
date 3, 2009-08-02
date 4, 2009-08-03
date 5, 2009-08-04 <- notice this date hasn't changed
但是重复键更新不是这样工作的,它只会更新冲突的行,如果该行随后与不同的行发生冲突,它会因重复键错误而退出。
有没有一种聪明的方法可以单独在 SQL 中实现这种效果?