新しい行に対してのみ、デフォルトのNOW()のタイムスタンプ列を追加します


111

数千行のテーブルがあります。最初はcreated_at列でテーブルが作成されていなかったため、作成タイムスタンプを取得する方法はありません。ただし、将来の行のタイムスタンプの取得を開始することが重要です。

タイムスタンプ列をデフォルト値NOW()で追加して、前の行に値を入力せず、将来の行のみに値を入力する方法はありますか?

私が行う場合はALTER、クエリを、それがタイムスタンプを持つすべての行を取り込みます。

ALTER TABLE mytable ADD COLUMN created_at TIMESTAMP DEFAULT NOW()

回答:


157

デフォルトので列を追加してから、列をデフォルトにnull変更する必要がありますnow()

ALTER TABLE mytable ADD COLUMN created_at TIMESTAMP;
ALTER TABLE mytable ALTER COLUMN created_at SET DEFAULT now();

43

デフォルトのルールを変更テーブルで追加できます。

ALTER TABLE mytable ADD COLUMN created_at TIMESTAMP DEFAULT NOW()

次に、現在存在するすべての行をすぐにnullに設定します。

UPDATE mytable SET created_at = NULL

その後、この時点からDEFAULT有効になります。


トリガーを起動する可能性のある更新を実行するという重荷を背負っていますが、それは原則的には良好です。
Philip Couling

7
@Artur:フィリップが提示したソリューションは、進むべき道です。UPDATE必要ありません。デフォルトの列を既存の列に追加しても、既存の行は影響を受けません。デフォルトは、同じコマンドで列とデフォルトを追加した場合にのみ入力されます。
Erwin Brandstetter 2016

9

たとえば、次のようなテーブルを作成し、デフォルト値usersという名前dateの列を指定しますNOW()

create table users_parent (
    user_id     varchar(50),
    full_name   varchar(240),
    login_id_1  varchar(50),
    date        timestamp NOT NULL DEFAULT NOW()
);

ありがとう


0

次のようなものを試してください:-

ALTER TABLE table_name ADD  CONSTRAINT [DF_table_name_Created] 
DEFAULT (getdate()) FOR [created_at];

table_nameテーブルの名前に置き換えます。


このような制約の利点は何ですか?
rubo77
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.