답변:
트리거를 사용하십시오.
다음은 기본으로 사용할 수있는 코드입니다. UPDATE도 처리해야하는 경우 약간만 변경하면됩니다.
create table people
(
first_name varchar(20),
last_name varchar(20),
display_name varchar(40)
);
CREATE TABLE
CREATE OR REPLACE FUNCTION people_insert() RETURNS trigger AS '
BEGIN
NEW.display_name := NEW.first_name||'' ''||NEW.last_name;
RETURN NEW;
END;
' LANGUAGE plpgsql;
postgres=# CREATE FUNCTION
CREATE TRIGGER people_insert BEFORE INSERT OR UPDATE ON people FOR
EACH ROW EXECUTE PROCEDURE people_insert();
postgres=# CREATE TRIGGER
insert into people values ('Larry','Ellison');
postgres=# INSERT 0 1
postgres=# select * from people;
first_name | last_name | display_name
------------+-----------+---------------
Larry | Ellison | Larry Ellison
(1 row)
postgres=#
CREATE TRIGGER people_insert BEFORE INSERT OR UPDATE...이 업데이트도 처리 하지 않습니까?
실제로 값을 저장할 필요는 없습니다 . 생성 된 열과 매우 유사하게 참조 할 수있는 함수를 작성할 수 있습니다. 한 가지주의 할 점은 참조는 항상 테이블 또는 별명 이름으로 규정되어야한다는 것입니다.
CREATE TABLE person
(
id int PRIMARY KEY,
first_name text,
last_name text NOT NULL
);
INSERT INTO person
VALUES
(1, 'John', 'Smith'),
(2, 'Jane', 'Doe'),
(3, NULL, 'Prince');
CREATE FUNCTION display_name(rec person)
RETURNS text
STABLE
LANGUAGE SQL
COST 5
AS $$
SELECT
CASE
WHEN $1.first_name IS NULL THEN ''
ELSE $1.first_name || ' '
END || $1.last_name;
$$;
SELECT p.id, p.display_name FROM person p;
결과 :
아이디 | 이름 표시하기 ---- + -------------- 1 | 존 스미스 2 | 제인도 3 | 왕자 (3 행)
트라이 그램 유사성에 기반한 KNN 검색 사용을 포함하여 생성 된 값을 인덱스 할 수도 있습니다. 예를 들면 다음과 같습니다.
CREATE EXTENSION pg_trgm;
CREATE INDEX person_trgm_name
ON person
USING gist
(display_name(person) gist_trgm_ops);
SELECT
p.id,
p.display_name,
similarity(p.display_name, 'Jane')
FROM person p
ORDER BY p.display_name <-> 'Jane'
LIMIT 2;
이 유형의 검색은 검색 문자열에서 "거리"순서로 인덱스 스캔에서 행을 반환합니다. 이들이 얼마나 "가까운"지 보려면 거리 연산자 ( <->) 또는 similarity()함수 (1 거리)를 사용할 수 있습니다. KNN 검색은 매우 큰 데이터 세트가 있더라도 K "가장 가까운 이웃"을 매우 빠르게 반환 할 수 있습니다.
last_name에 있다고 선언했다 NOT NULL. :-) 우리는 테이블에 있고 트리거에 의해 유지되는 것과 같은 이름 열을 가지고 있었고 많은 어려움 없이이 접근법으로 전환했지만 프레임 워크는 항상 별칭을 사용하고 항상 참조를 한정하므로 부분이 쉽습니다. 열 참조를 규정하는 데 일관성이없는 코드가 있다면 모든 경우를 추적하기가 어려울 수있는 곳을 알 수 있습니다.