Có, có returning
INSERT INTO tag ("key", "value")
SELECT 'key1', 'value1'
WHERE NOT EXISTS (
SELECT id, "key", "value"
FROM node_tag
WHERE key = 'key1' AND value = 'value1'
)
returning id, "key", "value"
Để trả lại hàng nếu nó đã tồn tại
with s as (
select id, "key", "value"
from tag
where key = 'key1' and value = 'value1'
), i as (
insert into tag ("key", "value")
select 'key1', 'value1'
where not exists (select 1 from s)
returning id, "key", "value"
)
select id, "key", "value"
from i
union all
select id, "key", "value"
from s
Nếu hàng không tồn tại, nó sẽ trả về hàng được chèn khác với hàng hiện có.
BTW, nếu cặp "key" / "value" làm cho nó trở thành duy nhất thì nó là khóa chính và không cần cột id. Trừ khi một hoặc cả hai cặp "khóa" / "giá trị" có thể là giá trị rỗng.