【问题标题】:Auto generate key on JDBC insert in SQL Server在 SQL Server 中插入 JDBC 时自动生成密钥
【发布时间】:2009-05-12 17:50:38
【问题描述】:

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

在桌子上没有运气。

【问题讨论】:

    标签: java sql-server database jdbc rdbms


    【解决方案1】:

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

    据我所知:

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

    【讨论】:

    • 对于 DB2,您可以在标识列和序列之间进行选择。我也可以想象其他 rdbms 的数量。
    • 感谢您的澄清。但是,这不包括其他 rdbms。至少对于甲骨文来说不是。
    【解决方案2】:

    您需要在测试表中设置 id 列以自动创建身份。如果是 SQL Server,则需要在 ID 列上设置IDENTITY() 属性。

    【讨论】:

      【解决方案3】:

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

      你总是可以使用 Hibernate。

      【讨论】:

      • 再解释一下 - 使用 Hibernate,您可以生成 DDL,甚至让 Hibernate 在启动时创建所有映射表。您只需要使用适当的“方言”告诉 Hibernate 目标数据库。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-28
        • 1970-01-01
        • 1970-01-01
        • 2013-09-01
        • 2018-01-12
        • 2013-03-19
        相关资源
        最近更新 更多