我尝试使用以下唯一约束创建下表。我收到以下代码的相同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`)"
答案 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。