如何在Scala/Java中向PostgreSQL的SERIAL列插入DEFAULT值
PostgreSQL SERIAL列插入默认值的解决方案
针对你遇到的问题——MySQL可通过st.setNull(1, java.sql.Types.NULL)给自增列插入NULL自动生成值,但PostgreSQL的SERIAL列不支持这种方式,且INSERT INTO serial_table VALUES()会报错,这里提供几种可行的解决办法:
方法1:使用DEFAULT VALUES语句
PostgreSQL支持直接插入所有列的默认值,对于你的单列表,可执行:
INSERT INTO serial_table DEFAULT VALUES;
对应的Java代码无需设置任何参数,直接执行PreparedStatement即可:
PreparedStatement st = conn.prepareStatement("INSERT INTO serial_table DEFAULT VALUES"); st.executeUpdate();
方法2:在SQL中直接写DEFAULT代替占位符
如果需要保留列名(比如后续可能扩展表结构),可以把占位符替换为DEFAULT:
INSERT INTO serial_table (id) VALUES(DEFAULT);
同样无需设置参数,直接执行语句即可。若要兼容MySQL和PostgreSQL,可根据当前连接的数据库类型动态生成SQL:MySQL用?,PostgreSQL用DEFAULT。
方法3:使用PostgreSQL JDBC扩展API
PostgreSQL的JDBC驱动提供了扩展方法PGStatement.setDefault(int parameterIndex),可指定某个占位符使用默认值。注意这个方法是PostgreSQL特有的,不具备跨数据库兼容性:
// 需要先把PreparedStatement转为PGStatement PGStatement pgSt = (PGStatement) st; pgSt.setDefault(1);
另外你猜测直接传入字符串"DEFAULT"不可行是对的,PostgreSQL会把它当作字符串值处理,而SERIAL列是整数类型,会抛出类型不匹配的错误。
内容的提问来源于stack exchange,提问作者Buttle Butkus
相关产品推荐
相关产品推荐

