次の表があります。
Study id
Pepsi 1
Coke 2
Sprite 3
上の表に新しい列を追加する必要がありtimestamp
ます。つまり、スタディの作成日時がこの列に保存されます。既存の行にどの値を設定する必要がありますか? または、「タイムスタンプ」列には、新しく作成された行に対してのみ値を設定する必要がありますか?
次のクエリを使用して、新しい列を追加しました。
alter table Study add Timestamp datetime
次の表があります。
Study id
Pepsi 1
Coke 2
Sprite 3
上の表に新しい列を追加する必要がありtimestamp
ます。つまり、スタディの作成日時がこの列に保存されます。既存の行にどの値を設定する必要がありますか? または、「タイムスタンプ」列には、新しく作成された行に対してのみ値を設定する必要がありますか?
次のクエリを使用して、新しい列を追加しました。
alter table Study add Timestamp datetime
既存の行にどの値を設定する必要があるかを伝える方法はありません。それはあなた次第です。他の情報をつなぎ合わせて作成時間を取得できる場合は、おそらくこれを 1 つずつ行うか、既存の行をそのままにしておくことができますNULL
。
GETDATE()
列にデフォルトの likeを設定し、それを に設定するとNOT NULL
、既存のすべての行が現在の日付と時刻を継承するように強制されます。これらを に戻すことはできませんNULL
。私は1900-01-01
不明を表すようなガベージ トークン値を使用することにまったく反対です。また、「日付が 2013 年 10 月 8 日の場合、それは私たちが知らなかったからです」などのようにコードを変更することも信じていません。したがってNULLable
、デフォルトで列を追加することをお勧めします。
ALTER TABLE dbo.Study ADD CreationTime DATETIME NULL DEFAULT CURRENT_TIMESTAMP;
GO
DEFAULT
列を null 可能のままにしておくと、 DML がそれを に設定しない場合にのみ制約が有効になることに注意してくださいNULL
。たとえば、INSERT
ステートメントが明示的にNULL
そこに配置されている場合、デフォルトは無視されます。これを回避する方法は、トリガーを使用することです (更新を処理するのと同じように):
CREATE TRIGGER dbo.StudyCreationTime
ON dbo.Study
FOR INSERT
AS
BEGIN
SET NOCOUNT ON;
UPDATE s
SET s.CreationTime = CURRENT_TIMESTAMP
FROM dbo.Study AS s
INNER JOIN inserted AS i
ON s.StudyID = i.StudyID;
END
GO