Database/MySQL, SQL

데이터베이스 시간 기록: created_at 과 updated_at 자동 업데이트 하기

Developer88 2024. 4. 13. 12:45
반응형

SQL문을 이용하면, 데이터베이스의 열이 업데이트 되면,

갱신된 현재의 시간으로 데이터가 바뀌도록 쉽게 할 수 있는데요.

오늘은 이것을 NodeJS과 MySQL을 이용해 구현해 보겠습니다.

 

1. 데이터베이스 생성 쿼리

먼저 student라는 학생에 관한 데이터를 다루는 테이블을 생성하는 SQL문을 생성하겠습니다.

주의해서 볼 부분이 'created_at'과 'updated_at'인데요.

 

  • 'DEFAULT CURRENT_TIMESTAMP': 값이 지정되지 않은 경우, 현재 시간이 기본값으로 설정 됨
  • 'ON UPDATE CURRENT_TIMESTAMP': 열을 UPDATE 할 때 해당 열에 현재 시간을 설정함.
    • 특정 열의 값을 업데이트할 때마다 해당 열의 값이 현재 시간으로 자동으로 갱신됨.

'ON UPDATE CURRENT_TIMESTAMP' 를 넣음으로서,

현재시간을 자동으로 업데이트 되도록 하였습니다.

 

const createTableQuery = `
CREATE TABLE IF NOT EXISTS student (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(255),
  score INT,
  parent_name VARCHAR(255),
  phone_number VARCHAR(20),
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)`;

 

 

2. NodeJS로 구현

2-1. 테이블 생성

SQL문이 준비되었으니, NodeJS로 구현해 보겠습니다.

가장 먼저 할 것은 위에서 준비된 테이블 쿼리를 이용해,

테이블을 생성하는 것 입니다.

 

const mysql = require('mysql');

const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'password',
  database: 'my_database'
});
connection.connect();

const createTableQuery = `
CREATE TABLE IF NOT EXISTS student (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(255),
  score INT,
  parent_name VARCHAR(255),
  phone_number VARCHAR(20)
)`;

// 테이블 생성
connection.query(createTableQuery, (err, result) => {
  if (err) throw err;
  console.log('테이블이 생성되었습니다.');
});

// MySQL 연결 종료
connection.end();

 

2-2. 데이터 추가하기

아래와 같이 데이터를 입력해 주면,

현재 시각을 넣지 않았음에도 created_at과 updated_at에,

데이터를 추가한 시간이 들어갑니다.

 

...

const insertDataQuery = `
INSERT INTO student (name, score, parent_name, phone_number) 
VALUES ('박이서', 90, '박기원', '010-3333-222'),
       ('이지원', 85, '이현원', '010-3333-222'),
       ('서연히', 95, '서응수', '010-3333-222')`;

connection.query(insertDataQuery, (err, result) => {
  if (err) throw err;
  console.log('데이터가 추가되었습니다.');
});

// MySQL 연결 종료
connection.end();

 

한번 더 데이터를 넣으면,

created_at에는 변화가 없고,

updated_at만 다른 timestamp가 찍히게 됩니다.

 

3. ON UPDATE CURRENT_TIMESTAMP 는 SQLite 지원 안됨

참고로 SQLite에서는,

DEFAULT CURRENT_TIMESTAMP는 지원이 되지만,

ON UPDATE CURRENT_TIMESTAMP는 지원이 되지 않습니다.

 

그래서, 조금 복잡할 수 있는 TRIGGER를 사용하거나,

update시에 아래 코드로 구한 시간을 직접 넣어주는 방법을 대안으로 선택할 수 있습니다.

 

function getUpdatedAt() {
  return new Date().toISOString();
}

 

728x90