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

行が見つからないDELETEの後に条件付きでUPDATE/INSERTを実行するにはどうすればよいですか?

    DELETEの場合 修飾行が見つかりません。そのRETURNING 句は行なしを返します 。

    タイトルは、「削除後に条件付きで更新/挿入する」を要求します。 、しかし、本文は「削除する行がない場合は失敗します」と文句を言います 。削除する行の存在が条件ではない場合、条件は何ですか?

    手足に出かける、これはかもしれない あなたが望むものになりなさい:

    CREATE FUNCTION updateoutfit(_id UUID, _title text DEFAULT NULL::text, _garments json)
      RETURNS TABLE (id UUID, title text, garments json)
      LANGUAGE sql AS
    $func$
    DELETE FROM outfit_garment WHERE outfit_id = _id;  -- DELETE if exists
    
    INSERT INTO outfit (id, title)  -- UPSERT outfit
    VALUES (_id, _title)
    ON CONFLICT (id) DO UPDATE
    SET    title = EXCLUDED.title;
       
    WITH ins AS (  -- INSERT new rows in outfit_garment
       INSERT INTO outfit_garment (position_x, outfit_id)
       SELECT "positionX", _id
       FROM   json_to_recordset(_garments) AS x("positionX" float)  -- outfit_id UUID was unused!
       RETURNING json_build_object('positionX', position_x) AS garments
       )
    SELECT _id, _title, json_agg(garments)
    FROM   ins
    GROUP  BY id, title;
    $func$;
    

    テーブルoutfit_garmentからすべての行を削除します 指定されたUUIDに対して、テーブルoutfitの行を挿入または更新します。 、最後にテーブルoutfit_garmentに新しい詳細行を追加します 。 outfit_id _garmentsで渡されます 無視されます。
    次に、すべての衣服がJSON値にマージされた単一の行を返します。



    1. キャッシュなしでMySQLのパフォーマンスを向上

    2. PHP/MySQLで最後に作成された行にアクセスする

    3. 1か月あたりのすべての日のリストを作成し、値を毎日均等に分割します

    4. mysqlサーバーのポート番号