【发布时间】:2014-09-11 05:21:09
【问题描述】:
有什么方法可以通过 JDBC 显式发送 DEFAULT 占位符,就像在 INSERT INTO sometables VALUES (blah, DEFAULT) 中一样? (我几乎可以肯定答案是否定的,但我正在寻找 JDBC 专家的确认)。
假设你有一个 PreparedStatement 喜欢:
INSERT INTO mytable(a, b) VALUES (?, ?)
表:
CREATE TABLE mytable (
a integer,
b integer default some_function()
);
并且您想在批处理中的某些执行中使用数据库集 DEFAULT for mytable.b 而不是其他执行。
在常规 SQL 中你会写:
INSERT INTO mytable(a, b) VALUES (1, 42)
INSERT INTO mytable(a, b) VALUES (2, DEFAULT);
...
当然也可以:
INSERT INTO mytable(a, b) VALUES (1, 42)
INSERT INTO mytable(a) VALUES (2);
...但是您不能通过 JDBC 执行此操作。 setString("DEFAULT") 当然不会发送 DEFAULT 关键字,只会发送字符串文字 'DEFAULT'。
有没有办法在任何广泛使用的驱动程序中设置一个表示DEFAULT 的占位符参数?
我看不到使用标准 API 和规范的方法。
我在想象这样的事情:
pstmt.setObject(2, Postgresql.DEFAULT, Types.OTHER);
其中Postgresql.DEFAULT 是一个特殊的占位符实例,因为PreparedStatement 似乎没有setDefault() 方法。
任何现有的驱动程序都支持这个吗?
【问题讨论】:
-
如果您需要默认值的地方很少,您可以只拥有两个副本:
insert into mytable(a b) values (?, ?)和insert into mytable(a b) values (?, ?)。 -
解决方法是先执行查询以获取列默认值,然后将它们作为值包含在 PreparedStatement 中: SELECT
COLUMN_NAME, COLUMN_DEFAULTFROMINFORMATION_SCHEMA.COLUMNSWHERETABLE_SCHEMA='dbName ' ANDTABLE_NAME='tableName'; -
@AaronDuniganAtLee 如果默认值是文字,这将起作用,但如果默认值是表达式,则可能会产生令人惊讶的结果 - 您不能包含任意 SQL 表达式作为绑定参数。