在SQL Server中的JDBC插入上自动生成密钥

时间:2009-05-12 17:50:38

标签: java sql-server database jdbc rdms

是否存在通用的交叉RDMS,我可以在JDBC插入上自动生成密钥?例如,如果我有一个包含主键,id和int值的表:

create table test (
  id int not null,
  myNum int null
)

并执行插入

PreparedStatement statement = connection.prepareStatement("insert into test(myNum) values(?)", Statement.RETURN_GENERATED_KEYS);
statement.setInt(1, 555);
statement.executeUpdate();
        statement.close();

我得到一个java.sql.SQLException:无法将值NULL插入列'id'。

我感觉这完全取决于RDMS。我们正在使用SQL Server 2005,我已经设置了

CONSTRAINT [PK_test] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 1) ON [PRIMARY]

在表中没有运气。

4 个答案:

答案 0 :(得分:6)

这完全取决于数据库。有两个主要选项:1 - 允许主键定义旁边的自动增量关键字的DBMS和2 - 提供序列生成器的DBMS(然后可以使用它来生成PK的新值,例如通过编写“插入前”触发器,在完成插入之前自动在列中插入新值。

据我所知:

  1. Firebird使用序列
  2. DB2允许将列定义为“GENERATED BY” DEFAULT AS IDENTITY“;
  3. Interbase使用序列(称为生成器)
  4. MySQL具有“AUTO_INCREMENT”子句
  5. Oracle使用序列
  6. PostgreSQL使用序列
  7. SQLServer具有“IDENTITY(1,1)”子句

答案 1 :(得分:2)

您需要在测试表中设置id列以自动创建标识。对于SQL Server,您需要在ID列上设置IDENTITY()属性。

答案 2 :(得分:2)

这取决于数据库。 Oracle需要创建SEQUENCE,而在MySQL上,您只需将列设置为自动增量。

你总是可以使用Hibernate。

答案 3 :(得分:1)

据我所知,它依赖于数据库。同样插入时间戳;有些会在插入null时插入当前时间。