Mám databázi Postgresql 8.1. V jedné tabulce jsou tři sloupce: first_name
, last_name
, display_name
.
Je možné nastavit výchozí hodnotu display_name
být first_name + " " + last_name
?
Použijte spoušť.
Zde je nějaký kód, který můžete použít jako základnu. Pokud také potřebujete zpracovat UPDATE, je nutná pouze malá změna.
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=#
Nemusíte vlastně kládat hodnotu; můžete vytvořit funkci, na kterou lze odkazovat podobně jako vygenerovaný sloupec. Jedním z důvodů je, že odkazy musí být vždy označeny názvem tabulky nebo aliasu.
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;
Výsledky:
id | display_name ---- + -------------- 1 | John Smith 2 | Jane Doe 3 | Prince (3 řádky)
Můžete dokonce indexovat vygenerovanou hodnotu, včetně použití KNN vyhledávání na základě trigramové podobnosti. Například:
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;
Tento typ vyhledávání vrací řádky z indexového skenování v pořadí „vzdálenost“ od vyhledávacího řetězce. Pokud chcete vidět, jak jsou "blízko", můžete použít operátor vzdálenosti (<->
) Nebo funkci similarity()
(což je 1 - vzdálenost). Hledání KNN může vrátit K „nejbližší sousedy“ velmi rychle, a to i s velmi velkým množstvím dat.
S nastavením VÝCHOZÍ v tabulce sloupců, ne.
Vaše nejlepší sázka je TRIGGER s NOVOU hodnotou pro každý sloupec, který chcete vypočítat.