programing

Postgre에서 타임스탬프를 자동으로 업데이트하려면 어떻게 합니까?SQL

bestprogram 2023. 5. 7. 12:03

Postgre에서 타임스탬프를 자동으로 업데이트하려면 어떻게 합니까?SQL

나는 코드가 Current_TIMestamp를 사용하여 MySQL에서 할 수 있는 것처럼 새로운 행이 삽입되었을 때 타임스탬프를 자동으로 업데이트할 수 있기를 원합니다.

PostgreSQL에서 어떻게 이를 달성할 수 있습니까?

CREATE TABLE users (
    id serial not null,
    firstname varchar(100),
    middlename varchar(100),
    lastname varchar(100),
    email varchar(200),
    timestamp timestamp
)

삽입하는 동안 열을 채우려면 다음 값을 사용합니다.

CREATE TABLE users (
  id serial not null,
  firstname varchar(100),
  middlename varchar(100),
  lastname varchar(100),
  email varchar(200),
  timestamp timestamp default current_timestamp
)

해당 열의 값은 문에 값을 입력하여 명시적으로 덮어쓸 수 있습니다.이를 방지하려면 트리거가 필요합니다.

E.J. Brennan이 언급한 대로 행이 업데이트될 때마다 해당 열을 업데이트해야 하는 경우에도 트리거가 필요합니다.

일반적으로 열 이름에 예약된 단어를 사용하는 것은 좋지 않습니다.다음과 다른 이름을 찾아야 합니다.timestamp

레코드를 변경할 때 변경하려면 삽입 트리거를 작성해야 하며 업데이트 트리거를 작성해야 합니다.이 기사는 그것을 꽤 잘 설명합니다.

http://www.revsys.com/blog/2006/aug/04/automatically-updating-a-timestamp-column-in-postgresql/

CREATE OR REPLACE FUNCTION update_modified_column()   
RETURNS TRIGGER AS $$
BEGIN
    NEW.modified = now();
    RETURN NEW;   
END;
$$ language 'plpgsql';

트리거를 다음과 같이 적용합니다.

CREATE TRIGGER update_customer_modtime BEFORE UPDATE ON customer FOR EACH ROW EXECUTE PROCEDURE  update_modified_column();

값이 변경된 경우에만 타임스탬프 업데이트

E 기준.J의 링크 및 이 링크에서 if 문 추가(https://stackoverflow.com/a/3084254/1526023)

CREATE OR REPLACE FUNCTION update_modified_column()
RETURNS TRIGGER AS $$
BEGIN
   IF row(NEW.*) IS DISTINCT FROM row(OLD.*) THEN
      NEW.modified = now(); 
      RETURN NEW;
   ELSE
      RETURN OLD;
   END IF;
END;
$$ language 'plpgsql';

'now()'를 기본값으로 사용하면 타임스탬프가 자동으로 생성됩니다.

Postgres의 타임스탬프 필드를 자동으로 업데이트하려면 다음과 같이 하십시오.새 행을 삽입할 때마다 SQL을 설정할 수 있습니다.current_timestamp그대로default값:

CREATE TABLE users (
    id serial not null,
    firstname varchar(100),
    middlename varchar(100),
    lastname varchar(100),
    email varchar(200),
    timestamp timestamp default current_timestamp
)

또한 이후에는 다른 사용자가 이 필드를 업데이트하지 못하도록 할 수 있으며, 업데이트 트리거를 만들고 적용하여 이를 수행할 수 있습니다.

CREATE OR REPLACE FUNCTION stop_change_on_timestamp()
  RETURNS trigger AS
$BODY$
BEGIN
  -- always reset the timestamp to the old value ("actual creation time")
  NEW.timestamp := OLD.timestamp;
  RETURN NEW;
END;
$BODY$
CREATE TRIGGER prevent_timestamp_changes
  BEFORE UPDATE
  ON users
  FOR EACH ROW
  EXECUTE PROCEDURE stop_change_on_timestamp();

업데이트 및 Liquibase YAML의 경우:

databaseChangeLog:
  - changeSet:
      id: CREATE FUNCTION set_now_to_timestamp
      author: Konstantin Chvilyov
      changes:
        - sql:
            sql: CREATE OR REPLACE FUNCTION set_now_to_timestamp() RETURNS TRIGGER LANGUAGE plpgsql AS 'BEGIN NEW.timestamp = NOW(); RETURN NEW; END;'

  - changeSet:
      id: CREATE TRIGGER update_users_set_now_to_timestamp
      author: Konstantin Chvilyov
      changes:
        - sql:
            sql: CREATE TRIGGER update_users_set_now_to_timestamp BEFORE UPDATE ON users FOR EACH ROW EXECUTE PROCEDURE set_now_to_timestamp();

언급URL : https://stackoverflow.com/questions/9556474/how-do-i-automatically-update-a-timestamp-in-postgresql