Primary Key、Unique Keyが設定されたスキーマをもつテーブルに対してレコードの変更が出来る。例えば、とある銘柄の株価4本値をテーブルに格納後にレコードを修正する場合に、日付をPrimary Keyにしておけばレコードの重複を防ぎながら変更も出来る。変更には次の3つの方法があり、微妙にユースケースが異なる
-
新規追加もしくは変更
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 -
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 -
updateは既存のレコードが確実にある場合のみ実行される
2番目のレコードが修正される。2番目のレコードが無いのならテーブルの変更は行われない。
sqlite> update users SET age = 30 where id=2; sqlite> select * from users ; 1|太郎| 2|次郎|30
