1

我使用 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,而无需将其声明为标识列:

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) 
);

尽管我不得不承认我看不到这背后的用例。如果您自动增加 ID,您可能会得到列的重复值,hash因为两者的组合必须是唯一的,而不仅仅是其中一个。

您是否希望它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 回答