Привет,
У меня есть эта таблица на сервере postgreSQL 8.4:
CREATE TABLE tags (
tagid bigserial PRIMARY KEY,
name text NOT NULL,
value text NOT NULL,
UNIQUE(name,value)
);
Обычное поведение INSERT - выдавать ошибку, когда новые значения нарушают ограничение уникальности.Я бы предпочел, чтобы он не выдавал ошибку и не возвращал либо новый tagid, если затем вставка прошла успешно, либо tagid существующей записи, соответствующей ограничению уникальности.
Я использую эту функцию для этого:
CREATE OR REPLACE FUNCTION insert_tags(my_name text, my_value text)
RETURNS bigint AS $$
DECLARE
retval bigint;
BEGIN
SELECT tagid INTO retval FROM tags WHERE name = my_name AND value = my_value;
IF FOUND THEN
RETURN retval;
END IF;
INSERT INTO tags (name, value) VALUES (my_name, my_value) RETURNING tagid INTO retval;
RETURN retval;
END;
$$ LANGUAGE plpgsql;
В худшем случае перед вставкой выполняется два просмотра таблицы.Есть ли лучший способ сделать это, возможно, одним поиском?