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

INSERT [...] ON CONFLICTを外部キー違反に使用できますか?

    はい、入力行を参照テーブルに結合します。これにより、FK列に一致しない行が削除されます:

    INSERT INTO entries(entry_id, referenced_id, name)
    SELECT val.entry_id, val.referenced_id, val.name
    FROM  (
      VALUES (1, 2, 'references two')
             -- more?
      ) val (entry_id, referenced_id, name)
    JOIN   referenced USING (referenced_id)  -- drop rows without matching FK
    ON     CONFLICT (entry_id) DO NOTHING;   -- drop rows with duplicate id
    

    UPSERT自体(INSERT ... ON CONFLICT DO NOTHING )固有の違反にのみ反応します。マニュアル:

    ON CONFLICT 一意性制約または除外制約違反エラーを発生させるための代替アクションを指定するために使用できます。 (以下の紛争条項を参照してください。)

    VALUES以降 式はINSERTにアタッチされなくなりました 直接、列タイプはターゲットテーブルから派生しません。 キャストが必要になる場合があります 非基本タイプで操作する場合は、値を明示的に入力します。参照:

    • 複数の行を更新するときにNULLタイプをキャストする



    1. Fluent NHibernateおよびPostgreSQL、SchemaMetadataUpdater.QuoteTableAndColumns-System.NotSupportedException:指定されたメソッドはサポートされていません

    2. 検索条件に「%」が含まれる「%」を使用したSQL「LIKE」クエリ

    3. 損傷したSQLバックアップを修復するSQLバックアップリカバリツール-製品レビュー-ダニエルジョーンズによるゲスト投稿

    4. WorkbenchMySQLクライアントを使用してデータベースに接続する方法