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
'programing' 카테고리의 다른 글
Git: 추적된 파일 무시 (0) | 2023.05.07 |
---|---|
스트림을 문자열로 변환하고 되돌리는 중 (0) | 2023.05.07 |
VBA(excel)에서 정규식 일치 항목 반환 (0) | 2023.05.07 |
인수가 중간에 있는 PowerShell 별칭을 작성하려면 어떻게 해야 합니까? (0) | 2023.05.07 |
mongodb 인덱스 생성 작업 상태 (0) | 2023.05.07 |