Sql 递归的;“关于重复密钥更新”;

Sql 递归的;“关于重复密钥更新”;,sql,datetime,mysql,recursion,unique-constraint,Sql,Datetime,Mysql,Recursion,Unique Constraint,我有一个数据库表,在日期列上有一个唯一的键,所以每个日期不能超过一行。如果我为数据库中已经存在的某一天插入新行,我希望它将所有后续连续日期向后推一天,直到到达“空闲”日 以下是我的想法: INSERT INTO `activity` (`name`,`date`) VALUES ('date 7','2009-07-31') ON DUPLICATE KEY UPDATE `date` = DATE_ADD(`date`, INTERVAL '1' DAY) 我的想法是,ON-DUPL

我有一个数据库表,在日期列上有一个唯一的键,所以每个日期不能超过一行。如果我为数据库中已经存在的某一天插入新行,我希望它将所有后续连续日期向后推一天,直到到达“空闲”日

以下是我的想法:

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更新会在表中冒泡,并不断向每个日期添加一天,直到它到达一个不存在的日期

例如,如果我的表格内容如下所示:

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
日期1,2009-07-30
日期2,2009-07-31
日期3,2009-08-01
日期4,2009-08-02

日期5,2009-08-04查询目标日期当天或之后的第一个自由日期。这涉及到一个左自联接来查找表中没有后续日期的日期

SELECT DATE_ADD(Min(a.`date`), INTERVAL '1' DAY) AS `free_date`
FROM `activity` a
LEFT JOIN `activity` z
ON z.`date` = DATE_ADD(a.`date`, INTERVAL '1' DAY)
WHERE z.`date` IS NULL 
AND a.`date` >= '2009-07-31'
运行更新以在目标日期和第一个自由日期之间的范围内递增每个日期


现在有空间进行所需的插入。

在执行更新之前选择最长日期,然后在最长日期中添加一天

诸如此类:

关于重复密钥

 UPDATE `date` = DATE_ADD(select max('date') from 'activity', INTERVAL '1' DAY)

我认为您应该将左连接更改为内部连接。@列文:它必须是左连接,因为我们要检索的记录是那些缺少后续日期的记录。抱歉,时间太晚了。我一直在打字,但我的大脑已经关闭了。
 UPDATE `date` = DATE_ADD(select max('date') from 'activity', INTERVAL '1' DAY)