You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 11:31:41