1

DBエンジンとしてHSQLDBを使用しています。複合主キーを持つテーブルを作成したいと考えています。私はこのコードを使用します:

CREATE TABLE sample_table ( hash VARCHAR(20), 
id INTEGER, data VARCHAR(256), PRIMARY KEY(hash, id) )

しかし、自動インクリメンタルにするためには id が必要です。つまり、次のようなものが必要な場合:

ハッシュ ID データ


abc 1 data_string_1 abc 2 data_string_2 efg 1 some_string_1 abc 3 some_data_again efg 2 last_string

このコードを使用する場合:

CREATE TABLE sample_table ( hash VARCHAR(20), 
id INTEGER IDENTITY, data VARCHAR(256), PRIMARY KEY(hash, id) )

(だから私は id を自動増分主キーにします) 例外がスローされます:

java.sql.SQLSyntaxErrorException: 主キーは既に存在します

この問題を解決するにはどうすればよいですか? 私としては、COUNT(id)で複数のクエリを使用し、このカウントをインクリメントしてから新しい値を挿入するのは良くありません。HSQLDBに自動的に実行してもらいたいです

4

1 に答える 1

3

IDENTITY主キーを意味します。

ただし、ID 列として宣言しなくても、シーケンスを使用して ID を生成できます。

CREATE SEQUENCE sample_sequence;
CREATE TABLE sample_table 
( 
  hash  VARCHAR(20), 
  id    INTEGER generated by default as sequence sample_sequence, 
  data  VARCHAR(256), 
  PRIMARY KEY(hash, id) 
);

認めざるを得ませんが、この背後にあるユースケースがわかりません。hashID を自動インクリメントすると、一方だけではなく両方の組み合わせが一意である必要があるため、列 の値が重複する可能性があります。

idを実際identity(したがって PK) にし、列に対してのみ別の一意の制約hash- 代替キーとして機能させたいということでしょうか?

編集(フレッドのコメントに基づく)

別の方法として、少し短いバージョンを使用できます。

CREATE TABLE sample_table 
( 
  hash  VARCHAR(20), 
  id    INTEGER GENERATED BY DEFAULT AS IDENTITY, 
  data  VARCHAR(256), 
  PRIMARY KEY(hash, id) 
);
于 2013-05-09T21:50:50.003 に答える