如何使用clojure.java.jdbc创建PostgreSQL复合主键?
用clojure.java.jdbc创建带复合主键的PostgreSQL表
别再硬写PRIMARY KEY (f, g)啦,clojure.java.jdbc的create-table-ddl其实有专门的方式处理复合主键,完全不用你在列定义里塞字符串约束。
直接看正确写法:
(j/create-table-ddl :a_b [[:f :integer "REFERENCES a"] [:g :integer "REFERENCES b"]] {:primary-key [:f :g]})
为什么这么写?
- 列定义里用
:integer指定类型,后面跟上外键约束字符串,比你原来把类型和约束混写成一个字符串更符合Clojure的写法习惯,可读性也更强。 - 第三个参数传一个选项Map,
:primary-key对应的向量就是你要设为复合主键的列名集合,函数会自动帮你生成PRIMARY KEY (f, g)的语句,和你想要的目标SQL完全一致。
要是你之前试过给每个列加:primary true的方式,那可得注意了——这么做只会把最后一个标记的列设为单一主键,根本实现不了复合主键,比如下面这种写法就不对:
;; 错误示例:只会把g设为主键,不是复合主键 (j/create-table-ddl :a_b [[:f :integer "REFERENCES a" :primary true] [:g :integer "REFERENCES b" :primary true]])
所以最靠谱的方式就是用:primary-key选项参数,既简洁又能准确生成你需要的复合主键约束。
内容的提问来源于stack exchange,提问作者TrivialCase
相关产品推荐
相关产品推荐

