2011年11月3日木曜日

SQL Anywhere 行の挿入と更新を1ステートメントで

行の挿入と更新を1ステートメントでできるとトランザクションを考える必要がなく便利な場合が多い。
SQL Anywhereの場合はINSERT INTO ~ ON EXISTING UPDATE という句を使うとプライマリーキーを比較して挿入と更新を自動で切り替えて実施してくれる。


例として、前記事と同じこのようなテーブルに対して
  1. CREATE TABLE mytable (  
  2.     pkey      varchar(10) NOT NULL,  
  3.     value     varchar(20),  
  4.     created   datetime NOT NULL DEFAULT current timestamp,  
  5.     modified  datetime NOT NULL DEFAULT timestamp,  
  6.     PRIMARY KEY (pkey)  
  7. )  


1回目の実行結果
  1. INSERT INTO mytable (pkey,value)  
  2. ON EXISTING UPDATE  
  3. VALUES('1''abc');  

INSERTとして実行されます。



pkeyvaluecreatedmodified
1abc2011-11-02 23:44:39.1792011-11-02 23:44:39.179


2回目の実行結果
  1. INSERT INTO mytable (pkey,value)  
  2. ON EXISTING UPDATE  
  3. VALUES('1''xyz');  

プライマリーキーであるpkey=1に対するUPDATEとして実行されます。



pkeyvaluecreatedmodified
1xyz2011-11-02 23:44:39.1792011-11-03 00:06:21.069



他のRDBMSではMERGEやREPLACEというのが似たような動きをしてくれるようである。

0 件のコメント:

コメントを投稿