更新值未在hsqldb上生成实际更新

时间:2012-10-06 04:44:45

标签: clojure hsqldb

我是clojure的新手。一直在使用hsqldb玩jdbc。

此功能是否更新了“cedula”字段为主键的表“persona”

(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"})

但是之后如果我转到数据库中的.log文件,我会看到它删除然后插入。

/*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

这是正常的吗?

1 个答案:

答案 0 :(得分: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))))

正如你所看到的,除了应该更新之外,绝对没有办法产生任何东西。那么实际发生了什么?

From the HSQLDB docs

  

由于HyperSQL在.log文件中记录DDL和DML语句,因此该文件可用于检查发送到数据库的内容。 请注意,UPDATE语句由DELETE后跟INSERT语句表示。

因此HSQLDB日志只是编写DELETE和INSERT,即使正在执行的查询实际上是UPDATE。