Tana Gone
Tana Gone
~1 min read

Categories

Primary Key、Unique Keyが設定されたスキーマをもつテーブルに対してレコードの変更が出来る。例えば、とある銘柄の株価4本値をテーブルに格納後にレコードを修正する場合に、日付をPrimary Keyにしておけばレコードの重複を防ぎながら変更も出来る。変更には次の3つの方法があり、微妙にユースケースが異なる

  1. 新規追加もしくは変更

    2番目のレコードの変更を行ったが、nameカラムの値を指定していないのでNULLが代入されてしまっている。replaceはinsert or replaceと記載しても動作は変わらない。

    sqlite> .ta
    users
    sqlite> .sch users 
    CREATE TABLE users (id INTEGER PRIMARY KEY,
        name TEXT, age Integer
    );
    sqlite> select * from users ;
    1|太郎|
    2|次郎|40
    sqlite> replace into users(id, age) values(2, 30);
    sqlite> select * from users ;
    1|太郎|
    2||30
    
  2. NULLが代入されない様にする

    2番目のレコードのageカラムの値を変更し、nameカラムの値を変更したくない場合には次の様にすれば良い。下記のexcluded.ageは外部ageのことでテーブル外のinsert分のvalues句で与えた値のことである。

    sqlite> select * from users ;
    1|太郎|
    2|次郎|30
    sqlite> insert into users(id, age) values(2, 40) on conflict(id) do update SET age = EXCLUDED.age;
    sqlite> select * from users ;
    1|太郎|
    2|次郎|40
    
  3. updateは既存のレコードが確実にある場合のみ実行される

    2番目のレコードが修正される。2番目のレコードが無いのならテーブルの変更は行われない。

    sqlite> update users SET age = 30 where id=2;
    sqlite> select * from users ;
    1|太郎|
    2|次郎|30