Database 시간 기본 값

Database 시간 기본 값

Database에 NOW()

RDBS를 사용하면서 Mongoose를 사용할 때와 다르게 일단 직접 쿼리문을 작성하고 있다.

Insert문을 작성할 때, 작성 시간과 수정 시간을 저장하기 위해 NOW()를 통해 현재 시간을 작성했다.

하지만 매번 Insert문을 작성하고, Update문을 작성할 때마다 쿼리에 NOW()를 써야할까?

Table 생성 시 Default

Insert, Update에서 무의식적으로 NOW()를 통해 시간 값을 생성했는데, 생각해보면 Table을 생성할 때, Default로 사용할 수 있지 않을까 싶었다. (질문을 받아 생각해보니 그럴 것 같았다.)

CREATE TABLE posts (
	title varchar(100) NOT NULL,
    created timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
);

그 결과 아래와 같이 기본 값으로 시간을 저장할 수 있게 되었다.

Update할 때 기본으로?

하지만 아직 Update를 진행할 때, 기본으로 updated가 변경되지 않는다.

MySQL

만약 MySQL을 사용하고 있다면,
이를 위해서 다음과 같이 Table을 생성하면 된다.

CREATE TABLE posts (
	title varchar(100) NOT NULL,
    created timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

PostgreSQL

하지만, PostgreSQL을 사용할 땐, 적용되지 않았다.

MySQL과 PostgreSQL 비교를 확인해보면, PostgreSQL에서는 Update 시 현재 시간을 기본 값으로 적용하기 위해서는 트리거를 사용한다.

CREATE OR REPLACE FUNCTION update_updated_column() 
        RETURNS TRIGGER AS '
  BEGIN
    NEW.updated = NOW();
    RETURN NEW;
  END;
' LANGUAGE 'plpgsql';

CREATE TRIGGER update_updated_modtime BEFORE UPDATE
  ON posts FOR EACH ROW EXECUTE PROCEDURE
  update_updated_column();

트리거의 결과로 updatedNOW()로 갱신하는 FUNCTION을 생성하고, Update 시 해당 FUNCTION을 실행하도록 하는 TRIGGER를 생성한다.

참고자료

좋은 웹페이지 즐겨찾기