带有自动增量部分的复合主键

时间:2013-05-09 21:47:29

标签: java hsqldb

我正在使用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自动执行

1 个答案:

答案 0 :(得分:2)

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列上 - 作为备用钥匙?

修改(根据Fred的评论)

作为替代方案,您可以使用稍短的版本:

CREATE TABLE sample_table 
( 
  hash  VARCHAR(20), 
  id    INTEGER GENERATED BY DEFAULT AS IDENTITY, 
  data  VARCHAR(256), 
  PRIMARY KEY(hash, id) 
);