5

JDBC 挿入でキーを自動生成できる一般的なクロス RDMS の方法はありますか? たとえば、主キー、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: Cannot insert the value NULL into column '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

これは完全にデータベースに依存します。主なオプションは 2 つあります。1 - 主キー定義の横に自動インクリメント キーワードを許可する DBMS と、2 - シーケンス ジェネレータを提供する DBMS (これを使用して、PK の新しい値を生成することができます。たとえば、挿入が完了する前に列に新しい値を自動的に挿入する「before insert」トリガー)。

私の知る限りでは:

  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

これはデータベースに依存します。OracleではSEQUENCEを作成する必要があり、MySQLでは列を自動インクリメントとして設定するだけです。

いつでもHibernateを使用できます。

于 2009-05-12T18:02:04.007 に答える
2

ID を自動作成するには、テスト テーブルに id 列を設定する必要があります。SQL Server の場合IDENTITY()、ID 列にプロパティを設定する必要があります。

于 2009-05-12T17:55:58.963 に答える
1

私の知る限り、それはデータベースに依存しています。タイムスタンプを挿入する場合も同様です。ヌルを挿入すると、現在の時刻が挿入される場合があります。

于 2009-05-12T17:53:10.013 に答える