0

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

此功能是否更新表“角色”,其中字段“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"})

但在那之后,如果我转到数据库中的 .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

这正常吗?

4

1 回答 1

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。那么究竟发生了什么?

从 HSQLDB 文档

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

所以 HSQLDB 日志只是简单地写一个 DELETE 和 INSERT,即使正在执行的查询实际上是一个 UPDATE。

于 2012-10-06T05:05:49.210 回答