Thêm cột dấu thời gian với mặc định NOW () chỉ cho các hàng mới


111

Tôi có một bảng có hàng nghìn hàng. Vì ban đầu bảng không được tạo bằng cột create_at nên không có cách nào để lấy dấu thời gian tạo của chúng. Mặc dù vậy, điều quan trọng là bắt đầu lấy dấu thời gian cho các hàng trong tương lai.

Có cách nào để tôi có thể thêm cột dấu thời gian với giá trị mặc định NOW () để nó không điền các giá trị vào các hàng trước đó mà chỉ cho các hàng trong tương lai không?

Nếu tôi thực hiện ALTERtruy vấn, nó sẽ điền vào tất cả các hàng có dấu thời gian:

ALTER TABLE mytable ADD COLUMN created_at TIMESTAMP DEFAULT NOW()

Câu trả lời:


158

Bạn cần thêm cột với giá trị mặc định là null, sau đó thay đổi cột để có giá trị mặc định now().

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

43

Bạn có thể thêm quy tắc mặc định với bảng thay đổi,

ALTER TABLE mytable ADD COLUMN created_at TIMESTAMP DEFAULT NOW()

sau đó ngay lập tức đặt thành null tất cả các hàng hiện có hiện tại:

UPDATE mytable SET created_at = NULL

Sau đó từ thời điểm này DEFAULTsẽ có hiệu lực.


Về nguyên tắc, nó tốt, mặc dù nó có trọng lượng của việc cập nhật có thể kích hoạt các trình kích hoạt.
Philip Couling

7
@Artur: Giải pháp mà Philip trình bày là cách để đi. UPDATEkhông cần thiết. Nếu bạn thêm một cột mặc định vào một cột hiện có , các hàng hiện có sẽ không bị ảnh hưởng. Mặc định chỉ được điền nếu bạn thêm cột và mặc định trong cùng một lệnh.
Erwin Brandstetter

9

Ví dụ: tôi sẽ tạo một bảng có tên usersnhư bên dưới và cung cấp cho một cột có tên datelà giá trị mặc địnhNOW()

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

Cảm ơn


0

Hãy thử một cái gì đó như: -

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

thay thế table_namebằng tên bảng của bạn.


lợi ích của một CONTSTRAINT như vậy là gì?
rubo77
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.