2016/12/20

[sqlite]最後の行を更新するのに悩む

python経由でSQLite3を使っているのだが、直接pythonとは関係が無い話だ。

最後にINSERTしたデータの一部をUPDATEしたかったのだが、何だかうまくいっていない。。。
まったく失敗しているというわけでもないようだが、期待したところが更新されていないので、うまくいっていないのだろう。

 

やっていたのは、どこかのページで見つけたやりかただ。

UPDATE tbl SET data1=? WHERE rowid=last_insert_rowid()

?のところは、pythonだとexecute()の引数に書けるのだが、まあそこは関係ないので省略しよう。
ともかく、これがうまくいかない。

エラーは出ていないので、SQL文は間違えていないのだろう。
検索すると、last_insert_rowid()でうまくいかないというところも見つかったのだが、まずは根っこを探そう。

 

Last Insert Rowid

sqlite.orgのページだ。
WITHOUT_ROWIDしていないなら使える。
返すのは、rowid of the most recent successful INSERT、だ。
INSERTに成功していなかったら0を返す、とある。
でも、INSERTは何度かしているし、データを見ても列はあるから、INSERTしていないはずはないのだが。。。

と思ったら、読み飛ばしていた。

have ever occurred on the database connection D

接続してから、でよいのかな。
だったら、なんとなく納得だ。
どこかでクローズしたりしていた気がするのだ。

 

コマンドのsqlite3で見ておこう。

SELECT rowid,* FROM tbl

これで、tblに入っているデータがrowidと一緒に出力される。
そうか、rowidは1から始まるから、last_insert_rowid()が0を返すとどれにも引っかからないのだな。

SELECT rowid,* FROM tbl WHERE rowid=last_insert_rowid()

うん、出てこない。

SELECT rowid,* FROM tbl WHERE rowid=last_insert_rowid()+1

うん、1行目が出てきた。
ということは、やはり0が返ってきていたのだろう。

 

今回の私は、UPDATE文で使いたいので、たぶんWHRER節でやってやらないといかんだろう。
もっと便利なやり方があるのかもしれんが、知らん。

UPDATE tbl SET data1=? WHERE rowid=(SELECT max(rowid) from tbl)

うむ、これでよさそうだ。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。