Tambahkan kolom cap waktu dengan default SEKARANG () untuk baris baru saja

112

Saya memiliki tabel yang memiliki ribuan baris. Karena tabel awalnya tidak dibuat dengan kolom create_at, tidak ada cara untuk mendapatkan stempel waktu pembuatannya. Sangat penting untuk mulai mendapatkan cap waktu untuk baris selanjutnya.

Apakah ada cara saya dapat menambahkan kolom cap waktu dengan nilai default SEKARANG () sehingga tidak akan mengisi nilai ke baris sebelumnya tetapi hanya untuk yang akan datang?

Jika saya melakukan ALTERkueri, itu mengisi semua baris dengan stempel waktu:

ALTER TABLE mytable ADD COLUMN created_at TIMESTAMP DEFAULT NOW()
Artur
sumber

Jawaban:

159

Anda perlu menambahkan kolom dengan default null, kemudian mengubah kolom menjadi default now().

ALTER TABLE mytable ADD COLUMN created_at TIMESTAMP;
ALTER TABLE mytable ALTER COLUMN created_at SET DEFAULT now();
Philip Couling
sumber
43

Anda bisa menambahkan aturan default dengan tabel alter,

ALTER TABLE mytable ADD COLUMN created_at TIMESTAMP DEFAULT NOW()

kemudian segera setel ke null semua baris yang ada saat ini:

UPDATE mytable SET created_at = NULL

Kemudian dari titik ini DEFAULTakan berlaku.

Renzo
sumber
Itu baik pada prinsipnya, meskipun itu membawa beban melakukan pembaruan yang dapat memicu pemicu.
Philip Couling
8
@ Artur: Solusi yang disajikan Philip adalah cara yang tepat. UPDATEtidak perlu. Jika Anda menambahkan default kolom ke yang ada kolom, baris yang sudah ada tidak terpengaruh. Default hanya diisi jika Anda menambahkan kolom dan default dalam perintah yang sama.
Erwin Brandstetter
9

Misalnya, saya akan membuat tabel bernama usersseperti di bawah ini dan memberikan kolom bernama datenilai defaultNOW()

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

Terima kasih

Mustafa Ahmad Fathy
sumber
0

Cobalah sesuatu seperti: -

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

mengganti table_namedengan nama tabel anda.

Michael Gungaram-Smith
sumber
1
apa keuntungan dari CONTSTRAINT seperti itu?
rubo77