У меня есть таблица базы данных с ключом UNIQUE в столбце даты, так что никогда не может быть более одной строки на дату. Если я вставлю новую строку для дня, который уже существует в базе данных, я хочу, чтобы все последующие последовательные даты отодвигались на один день назад, пока не будет достигнут «свободный» день.
Вот что я подумал:
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
… и я собираюсь вставить «дата 7» 2009-07-31, я бы хотел, чтобы это было так:
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?