95500


当方SQL初心者です。

テーブル内に以下のデータが存在しており、`column_A`はユニークIDとします。

[code]

    +----------+----------+
    | column_A | column_B |
    +----------+----------+
    | 0001     | HOGE     |
    | 0002     | FUGA     |
    | 0003     | PIYO     |
    +----------+----------+
    
[/code]

既存データと挿入したいデータの`column_A`が重複しない場合はそのままデータを挿入し、  
重複する場合はデータの更新を行いたいです。

管理上の都合により実行回数1回で済むSQL文を作りたいのですが、  
知識不足で1行にまとめることができませんでした。わかる方がいらっしゃいましたら教えて頂きたいです。

  
  
**パターン1：既存データと挿入したいデータの`column_A`が重複しない場合**  
挿入するデータ：`column_A='0004',column_B='BAKA'`

[code]

    +----------+----------+
    | column_A | column_B |
    +----------+----------+
    | 0001     | HOGE     |
    | 0002     | FUGA     |
    | 0003     | PIYO     |
    | 0004     | BAKA     |
    +----------+----------+
    
[/code]

  
**パターン2：既存データと挿入したいデータの`column_A`が重複する場合**  
挿入するデータ：`column_A='0001',column_B='AHO'`

[code]

    +----------+----------+
    | column_A | column_B |
    +----------+----------+
    | 0001     | AHO      |
    | 0002     | FUGA     |
    | 0003     | PIYO     |
    +----------+----------+
    
[/code]


CC BY-SA 4.0
2023-07-06T07:43:38.160
95499
2023-07-06T08:47:05.887
56030
question
mysql sql
条件によって処理が異なる1行（実行回数1回）のSQL文を作成したい


MySQLでは、主キーまたはユニークキーが重複しない場合は`Insert`、重複する場合は`Update`する仕組みとして[`INSERT ... ON
DUPLICATE KEY UPDATE ステートメント`](https://dev.mysql.com/doc/refman/8.0/ja/insert-
on-duplicate.html)が用意されています。  
下記の`パターン1`と`パターン2`の構文を参考にしてみてください。

**Schema (MySQL v5.7)**

[code]

    CREATE TABLE my_table (
      `column_A` VARCHAR(4)  PRIMARY KEY,
      `column_B` VARCHAR(4)
    );
    
    INSERT INTO my_table
      (`column_A`, `column_B`)
    VALUES
      ('0001', 'HOGE'),
      ('0002', 'FUGA'),
      ('0003', 'PIYO');
    
    -- パターン1
    INSERT INTO my_table (column_A, column_B)
    VALUES ('0004', 'FOO')
    ON DUPLICATE KEY UPDATE column_B = VALUES(column_B);
    
    -- パターン2
    INSERT INTO my_table (column_A, column_B)
    VALUES ('0001', 'BAR')
    ON DUPLICATE KEY UPDATE column_B = VALUES(column_B);
    
[/code]

* * *

**Query #1**

[code]

    select * from my_table;
    
[/code]

column_A | column_B  
---|---  
0001 | BAR  
0002 | FUGA  
0003 | PIYO  
0004 | FOO  
  
* * *

[View on DB Fiddle](https://www.db-fiddle.com/f/bQJ68Gu1uMv4jzZD5bXHhg/1)


CC BY-SA 4.0
2023-07-06T08:47:05.887
95500
2023-07-06T08:47:05.887
9820
95499
answer