問題は、新しい値が既存の値と重複し、実際には制約の違反があるという事実を考慮して、一意の値制約を持つ列に対してDATEADD関数を使用することです。同じ日付の2つの行を持つことはできないためです。X日間重複するUNIQUE制約のT-SQLデータ列の移動
私はDateTime型の列[SomeDate]を持つテーブルを持っており、一意であるという制約があります。私は2017-01-01から2018-01-01までの日付を持ち、それぞれに7日間を追加してレコードを更新したいと考えています。
問題は、新しい値が既存の値と重複し、実際には制約の違反があるという事実を考慮して、一意の値制約を持つ列に対してDATEADD関数を使用することです。同じ日付の2つの行を持つことはできないためです。X日間重複するUNIQUE制約のT-SQLデータ列の移動
私はDateTime型の列[SomeDate]を持つテーブルを持っており、一意であるという制約があります。私は2017-01-01から2018-01-01までの日付を持ち、それぞれに7日間を追加してレコードを更新したいと考えています。
可能な方法の1つは、日付を現在の最小最大範囲から外してから、追加する日数を考慮して戻すことです。
--Number of days we want to add to existing dates
DECLARE @daysToMoveAhead int = 7;
DECLARE @minDate datetime = (SELECT MIN([SomeDate]) from dbo.MyTable)
DECLARE @maxDate datetime = (SELECT MAX([SomeDate]) from dbo.MyTable)
DECLARE @diff int = DATEDIFF(DAY,@minDate,@maxDate)
--temporary move the dates out of existing min-max range
update dbo.MyTable set [SomeDate] = DATEADD(DAY, @diff,[SomeDate]);
--bring dates back and add as many days as we wanted
update dbo.MyTable set [SomeDate] = DATEADD(DAY, @daysToMoveAhead - @diff,[SomeDate]);
すべての行を更新する場合は、一意制約に問題はありません。私はそれがcodereview.stackexchange.comに属しているため、オフトピックとして、この質問を閉じるために投票しています
CREATE TABLE T
(
SomeDate date NOT NULL,
CONSTRAINT uc UNIQUE (SomeDate)
)
;WITH CTE AS
(
SELECT CAST(GETDATE() As Date) As TheDate
UNION ALL
SELECT CAST(DateADD(DAY, 1, TheDate) As Date)
FROM CTE
WHERE TheDate < DATEADD(DAY, 10, GETDATE())
)
INSERT INTO T(SomeDate)
SELECT TheDate
FROM CTE
UPDATE T
SET SomeDate = DATEADD(DAY, 3, SomeDate)
:
は、ここで簡単な例です。 OPがお互いに数秒以内に質問と回答を投稿したことを考えると、唯一の本当の疑問はこれをもっとうまくやる方法かもしれません。 – scsimon
質問をするときには、自分の知識を共有するために「あなた自身の質問に答える」オプションがあります。私は、他の人に同じような問題がある場合、そのような問題に対処する方法を他の人に示すためにそれをしました。誰かが正しい質問 - 答えを共有しているなら、特に私が「偽の投票」を得るためにそれをやっていないなら、投票のポイントを見ない。 –