У меня есть следующие две таблицы:
CREATE TABLE employee
(
id serial NOT NULL,
name character(32) NOT NULL,
CONSTRAINT employee_id_pkey PRIMARY KEY (id),
CONSTRAINT employee_name_ukey UNIQUE (name)
)
WITH (
OIDS=FALSE
);
ALTER TABLE employee
OWNER TO postgres;
CREATE TABLE worklog
(
id serial NOT NULL,
activity character(32),
employee integer NOT NULL,
"time" timestamp without time zone NOT NULL DEFAULT now(),
CONSTRAINT log_id_pkey PRIMARY KEY (id),
CONSTRAINT fk_employee FOREIGN KEY (employee)
REFERENCES employee (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
OIDS=FALSE
);
ALTER TABLE worklog
OWNER TO postgres;
-- Index: fki_employee
-- DROP INDEX fki_employee;
CREATE INDEX fki_employee
ON worklog
USING btree
(employee);
Я хотел бы сделать что-то вроде этого:
insert into
worklog (activity, employee)
values
('work in progress',
coalesce(
(select id from employee where name = 'jonathan'),
(insert into employee (name) values ('jonathan') returning id)
)
);
Однако, это возвращает ошибку:
ERROR: syntax error at or near "into"
LINE 8: (insert into employee (name) values ('jonathan') returning...)
Я где-то читал, что я мог бы просто вставить «имя» в employee
заранее и игнорировать возможную ошибку дублирующегося ключа, используя механизм ON CONFLICT ...
.Однако у меня есть две проблемы с этим подходом:
- Я использую postgres 9.4, а для конструкции AFAIK ON CONFLICT требуется 9.5
- Что еще более важно, ситуация, когда сотрудник не будетбыть в базе данных крайне редко.Так что большую часть времени ведущий вкладыш будет пустой тратой времени.
Возможно ли то, что я имею в виду, с postgres 9.4?