[MySQL] Default Value of Column

테이블 설계 시 ‘row가 테이블에 등록된 시각’을 의미하는 컬럼을 추가할 때가 있다.

이 컬럼의 이름을 reg_tm이라고 하겠다.

Oracle의 경우 reg_tm의 Default Value에 SYSDATE를 지정하면 Insert 시에 값을 별도로 지정해 줄 필요가 없어 편리했다.

MySQL에도 동일한 역할을 하는 NOW() 함수가 존재하는데, 이놈은 함수이기 때문에 컬럼의 Default Value로 지정하지 못하는 문제가 있다.

아래는 MySQL의 Documentation이다.

The DEFAULT value clause in a data type specification indicates a default value for a column. With one exception, the default value must be a constant; it cannot be a function or an expression. This means, for example, that you cannot set the default for a date column to be the value of a function such as NOW() orCURRENT_DATE. The exception is that you can specify CURRENT_TIMESTAMP as the default for TIMESTAMP andDATETIME columns. See Section 11.3.5, “Automatic Initialization and Updating for TIMESTAMP and DATETIME.

BLOB and TEXT columns cannot be assigned a default value.

(출처: http://dev.mysql.com/doc/refman/5.6/en/data-type-defaults.html)

Workaround로는 아래와 같은 방법이 있다.

  1. 테이블에 Insert를 감지하는 Trigger를 생성해 reg_tm을 Update하게 하는 방법
  2. reg_tm에 CURRENT_TIMESTAMP 를 Default Value로 설정하는 방법

1번의 방법의 경우 Trigger를 추가로 생성해줘야 한다는 점과, 대량 insert가 발생할 경우 trigger가 정상적으로 작동하지 않거나, 병목현상의 원인이 될 수 있다는 문제가 있다.

2 번 방법이 가장 수월한 방법이지만, MySQL 5.5까지는 CURRENT_TIMESTAMP는 Data Type이 TIMESTAMP일 때에만 사용할 수 있고, MySQL 5.6부터는 TIMESTAMP와 DATETIME에 사용할 수 있다.

 

나의 경우 현재 MySQL 5.5를 사용하고 있기 때문에 reg_tm의 Data Type을 TIMESTAMP로 변경해서 테이블을 생성할 수는 있지만, 이 경우 가독성이 너무 떨어진다는 단점이 있다. 가뜩이나 DB 시간을 KST가 아닌 UTC를 사용하고 있어서 시간 계산이 헷갈리는데 말이다.

따라서, 나는 Workaround를 통하지 않고, Insert 시에 매번 값을 넣어 주는 것으로 결론을 내렸다.

MySQL을 5.6으로 업그레이드하는 작업은.. 전~혀 고려하지 않고 있다.

 

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s