私は非常に頻繁に一意の制約を持つテーブルから行を取得する必要があり、存在しない場合は作成して戻ります。 たとえば、私のテーブルには、次のようになります。更新を必要とせずにINSERTからON CONFLICTを返す
CREATE TABLE names(
id SERIAL PRIMARY KEY,
name TEXT,
CONSTRAINT names_name_key UNIQUE (name)
);
そして、それは含まれています
id | name
1 | bob
2 | alice
その後、私はしたいと思います:
INSERT INTO names(name) VALUES ('bob')
ON CONFLICT DO NOTHING RETURNING id;
それとも:
INSERT INTO names(name) VALUES ('bob')
ON CONFLICT (name) DO NOTHING RETURNING id
ボブのIDを返すようにする1
。ただし、RETURNING
は、挿入または更新された行のみを返します。したがって、上記の例では、何も返されません。それを望むように機能させるためには、実際には次のことが必要です。
INSERT INTO names(name) VALUES ('bob')
ON CONFLICT ON CONSTRAINT names_name_key DO UPDATE
SET name = 'bob'
RETURNING id;
これは厄介なようです。私の質問は次の通りです:
(私の)希望の行動を許さない理由は何ですか?
もっとエレガントな方法がありますか?
をいただき、ありがとうございます回答!私はこれを "より良い"方法のように思えますが、私が記述した方法と実際的な違いは何ですか? – ira
@ira:上記の説明をいくつか追加しました。 –
@ErwinBrandstetter - これは常にIDを返しますか?私は試して、それは動作していないようだ - https://stackoverflow.com/q/46586793/435563 - おそらく私は何か間違っている? – shaunc