sql >> データベース >  >> RDS >> PostgreSQL

重複する制約値を指すアップサートエラー(競合の更新時)

    この問題は、明らかに一部のエントリに複数の作成者がいるという事実が原因で発生します。したがって、作成したselectクエリの内部結合は、同じエントリに対して複数の行を返し、INSERT ... ON CONFLICT それが好きではありません。 ReferenceAuthorのみを使用するため フィルタリング用のテーブルの場合、クエリを書き直すだけで、そのテーブルを使用して、existsを実行することにより、作成者がいないエントリのみをフィルタリングできます。 相関サブクエリで。方法は次のとおりです。

    INSERT INTO new.bookmonographs  (citavi_id, abstract, createdon, edition, title, year)
    SELECT "ID", "Abstract", "CreatedOn"::timestamp, "Edition", "Title", "Year"
    FROM old."Reference"
    WHERE old."Reference"."ReferenceType" = 'Book'
        AND old."Reference"."Year" IS NOT NULL
        AND old."Reference"."Title" IS NOT NULL
        AND exists(SELECT FROM old."ReferenceAuthor" WHERE old."ReferenceAuthor"."ReferenceID" = old."Reference"."ID")
        --Year, Title and Author must be present in the data, otherwise the entry is deemed useless, hence won't be included
    ON CONFLICT (citavi_id) DO UPDATE 
        SET (abstract, createdon, edition, title, year) = (excluded.abstract, excluded.createdon, excluded.edition, excluded.title, excluded.year)
    ; 
    


    1. 2つの日付の間の各日付のレコード数を計算します

    2. MySQLエラーヘルプ:On句の不明な列

    3. エラー:リレーションの列が存在しませんPostgreSQL、挿入クエリを実行できません

    4. mySQLIfステートメント