Tôi có một bảng tag
có 2 cột: id
(uuid) và name
(văn bản). Bây giờ tôi muốn chèn một thẻ mới vào bảng, nhưng nếu thẻ đã tồn tại, tôi chỉ muốn lấy id
bản ghi hiện có.
Tôi giả sử tôi chỉ có thể sử dụng ON CONFLICT DO NOTHING
kết hợp với RETURNING "id"
:
INSERT INTO
"tag" ("name")
VALUES( 'foo' )
ON CONFLICT DO NOTHING
RETURNING "id";
Nhưng điều này trả về một tập kết quả trống, nếu thẻ có tên "foo" đã tồn tại.
Sau đó tôi đã thay đổi truy vấn để sử dụng DO UPDATE
mệnh đề noop :
INSERT INTO
"tag" ("name")
VALUES( 'foo' )
ON CONFLICT ("name") DO UPDATE SET "name" = 'foo'
RETURNING "id";
Điều này hoạt động như dự định, nhưng hơi khó hiểu, vì tôi chỉ đặt tên cho giá trị đã tồn tại.
Đây có phải là cách để giải quyết vấn đề này hay có một cách tiếp cận đơn giản hơn mà tôi đang thiếu?
ERROR: missing FROM-clause entry for table "excluded"
khi sử dụng DO NOTHING
.
returning excluded.id
chưa