5

是否有一种通用的跨 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

4 回答 4

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)”子句
于 2009-05-12T18:56:50.737 回答
2

您需要在测试表中设置 id 列以自动创建身份。在 SQL Server 的情况下,您需要IDENTITY()在 ID 列上设置属性。

于 2009-05-12T17:55:58.963 回答
2

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

你总是可以使用休眠。

于 2009-05-12T18:02:04.007 回答
1

据我所知,它依赖于数据库。插入时间戳也是如此;有些会在您插入空值时插入当前时间。

于 2009-05-12T17:53:10.013 回答