2012-10-06 50 views
0

我是clojure的新手。一直在使用hsqldb玩jdbc。更新值不會生成hsqldb上的實際更新

這篇功能更新表「人物」,其中場「cedula」是主鍵

(defn update [cedula x] 
(sql/with-connection common/database 
    (sql/update-values :persona 
     ["cedula=?" cedula] x))) 

在REPL

(per/update 111 {:cedula 122 :nombre "Raul" :cargo "mm"}) 

跑這可是打那以後,如果我去了。日誌文件在數據庫中我看到它做了刪除,然後插入。

/*C15*/SET SCHEMA PUBLIC 
CONNECT USER SA 
SET AUTOCOMMIT FALSE 
DELETE FROM PERSONA WHERE CEDULA=111 
INSERT INTO PERSONA VALUES(122,'Raul','mm') 
COMMIT 
SET AUTOCOMMIT TRUE 
DISCONNECT 

這是正常的嗎?

回答

2

這是update-values代碼:

(defn update-values 
    "Updates values on selected rows in a table. where-params is a vector 
    containing a string providing the (optionally parameterized) selection 
    criteria followed by values for any parameters. record is a map from 
    strings or keywords (identifying columns) to updated values." 
    [table where-params record] 
    (let [[where & params] where-params 
     column-strs (map as-identifier (keys record)) 
     columns (apply str (concat (interpose "=?, " column-strs) "=?"))] 
    (do-prepared 
     (format "UPDATE %s SET %s WHERE %s" 
       (as-identifier table) columns where) 
     (concat (vals record) params)))) 

正如你所看到的,但絕對沒有辦法會產生什麼,但一個UPDATE,因爲它應該。那麼究竟發生了什麼?

From the HSQLDB docs

由於登錄的HyperSQL在.log文件的DDL和DML語句,這個文件可以用來檢查什麼被髮送到數據庫。 請注意,UPDATE語句由DELETE後跟INSERT語句表示。

因此,HSQLDB日誌只是簡單地編寫DELETE和INSERT,即使正在執行的查詢實際上是UPDATE。