새 행에 대해서만 기본 NOW ()로 타임 스탬프 열 추가


112

수천 개의 행이있는 테이블이 있습니다. 테이블은 처음에 created_at 열로 생성되지 않았기 때문에 생성 타임 스탬프를 얻을 수있는 방법이 없습니다. 미래의 행에 대한 타임 스탬프를 시작하는 것이 중요합니다.

기본값 NOW ()로 타임 스탬프 열을 추가하여 이전 행에 값을 채우지 않고 미래 행에 대해서만 값을 채울 수있는 방법이 있습니까?

ALTER쿼리를 수행하면 모든 행이 타임 스탬프로 채워집니다.

ALTER TABLE mytable ADD COLUMN created_at TIMESTAMP DEFAULT NOW()

답변:


159

기본값 인 열을 추가 null한 다음 기본값을 갖도록 열을 변경해야 now()합니다.

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

43

alter 테이블과 함께 기본 규칙을 추가 할 수 있습니다.

ALTER TABLE mytable ADD COLUMN created_at TIMESTAMP DEFAULT NOW()

그런 다음 현재 모든 기존 행을 즉시 null로 설정합니다.

UPDATE mytable SET created_at = NULL

그러면이 시점부터의 DEFAULT효력이 발생합니다.


원칙적으로는 좋지만 트리거 를 실행할 수 있는 업데이트를 수행하는 무게를 지닙니다.
Philip Couling 2016 년

8
@Artur : Philip이 제시 한 해결책은 바로가는 길입니다. UPDATE필요가 없습니다. 열 기본값을 기존 열에 추가하는 경우 이미 존재하는 행은 영향을받지 않습니다. 기본값은 동일한 명령에서 열과 기본값을 추가하는 경우에만 채워집니다.
Erwin Brandstetter

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테이블 이름으로 대체 합니다.


1
그러한 CONTSTRAINT의 이점은 무엇입니까?
rubo77
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.