postgresql 9.5では、INSERT ... ON CONFLICT(id)DO UPDATE ...構文をシーケンスIDでどのように使用できますか?
tbltest
次の列があるテーブル内:
tbltest_ID
自動インクリメントを行うデータベース内のシーケンスはどこにありますか。
以下は、更新に対して正常に機能します。IDが4のレコードを更新します。
INSERT INTO tbltest (
tbltest_ID,
tbltest_Name,
tbltest_Description)
VALUES
(4, 'test name','test description')
ON CONFLICT (tbltest_ID) DO UPDATE SET (
tbltest_Name,
tbltest_Description) = (
excluded.tbltest_Name,
excluded.tbltest_Description) RETURNING *;
ただし、DBに挿入のシーケンスIDを作成させるには、ステートメントからID列を削除する必要があります。
INSERT INTO tbltest (
tbltest_Name,
tbltest_Description)
VALUES
('test name','test description')
ON CONFLICT (tbltest_ID) DO UPDATE SET (
tbltest_Name,
tbltest_Description) = (
excluded.tbltest_Name,
excluded.tbltest_Description) RETURNING *;
これは、複数のレコードを新しいレコードと既存のレコードを更新する場合に問題になります。ID列を削除するかのように、それらはすべて挿入されます。そのままにしておくと、各行のVALUES配列にID値を指定する必要があります。また、IDを定義するときは、シーケンス(dbの自動インクリメント)を指定する必要があります。 )は使用されなくなりました。
INSERT ... ON CONFLICT(id)DO UPDATE ...構文spostをシーケンスIDとともに使用して、新しいレコードと既存のレコードの両方を含むレコードのセットを挿入/更新するにはどうすればよいですか?
たとえば、次は機能しません。
INSERT INTO tbltest (
tbltest_ID,
tbltest_Name,
tbltest_Description)
VALUES
(NULL, 'new record','new record description'),
(4, 'existing record name','existing record description')
ON CONFLICT (tbltest_ID) DO UPDATE SET (
tbltest_Name,
tbltest_Description) = (
excluded.tbltest_Name,
excluded.tbltest_Description) RETURNING *;
エラーをスローします:
エラー:列「tbltest_ID」のヌル値が非ヌル制約に違反しています
御時間ありがとうございます。
わかりました。Neil Conwayからこの素晴らしい記事を読みました:http://www.neilconway.org/docs/sequences/
ここで、彼はDEFAULT
キーワードの使用を示して、列のシーケンス値を使用するようにDBに指示します。
これが、現在機能する更新された例です。
INSERT INTO tbltest (
tbltest_ID,
tbltest_Name,
tbltest_Description)
VALUES
(DEFAULT, 'new record','new record description'),
(4, 'existing record name','existing record description')
ON CONFLICT (tbltest_ID) DO UPDATE SET (
tbltest_Name,
tbltest_Description) = (
excluded.tbltest_Name,
excluded.tbltest_Description) RETURNING *;
これが誰かを助けることを願っています;-)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加