Clojure JDBC:创建具有复合唯一约束的表时出现MySQL错误

时间:2014-10-13 18:47:47

标签: mysql sql jdbc clojure

我尝试使用以下唯一约束创建下表。我收到以下代码的相同MySQL错误,以及我的研究建议应该有效的三个类似的变体。

(defn create-prices-table [db]
  (db-do-commands db (create-table-ddl :prices
                                            [:priceid :integer "PRIMARY KEY" "AUTO_INCREMENT"]
                                            [:productid :integer "references products (productid)"]
                                            [:date "date"]
                                            [:price "decimal(7,2)"]
                                            :table-spec "UNIQUE KEY `uc_price` (`productid`, `date`)")))

其他尝试......

;; :table-spec "UNIQUE `uc_price` (`productid`, `date`)"
;; :table-spec "constraint uc_price unique (productid, date)"
;; :table-spec "constraint `uc_price` unique (`productid`, `date`)"

尝试执行时收到的消息......

CompilerException java.sql.BatchUpdateException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UNIQUE KEY `uc_price` (`productid`, `date`)' at line 1, compiling:(schema_test.clj:38:41)

我使用的是clojure.java.jdbc库的0.3.5版本。

修改

create-string-ddl返回

"CREATE TABLE prices (priceid integer PRIMARY KEY AUTO_INCREMENT, productid integer references products (productid), date date, price decimal(7,2)) UNIQUE KEY `uc_price` (`productid`, `date`)"

1 个答案:

答案 0 :(得分:1)

我已经看过这背后的Clojure code,它似乎并不支持约束条款。您可以通过执行以下操作来滥用API:

(create-table-ddl :prices
    [:priceid :integer "PRIMARY KEY" "AUTO_INCREMENT"]
    [:productid :integer "references products (productid)"]
    [:date "date"]
    [:price "decimal(7,2), CONSTRAINT UNIQUE KEY `uc_price` (`productid`, `date`)"])

也就是说,您已经处于嵌入MySQL特定语法的程度。您也可以自己编写create table语句。

不幸的是:table-spec适用于create table括号内的内容。请参阅MySQL文档中的table_option