2013-05-09 65 views
0

我使用HSQLDB作为数据库引擎。我想创建一个具有复合主键的表。我使用此代码:具有自动增量部分的复合主键

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

但我需要id是autoincremental。我的意思是,当我想有这样的事情:

哈希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 a ñ自动增加的主键)抛出一个异常:

java.sql.SQLSyntaxErrorException:主键已经存在

我能做些什么来解决这个问题? 对我来说,使用多个查询与COUNT(ID),然后增加此计数,然后插入新的价值并不好,我想HSQLDB做自动

回答

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列另一个唯一约束 - 作为备用钥匙吗?

编辑(基于弗雷德的评论)

您也可以使用一个稍短的版本替代:

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

很好的回答,但你可以自用的默认身份,而不是身份。完整的定义并不意味着主键。 – fredt 2013-05-09 23:02:34

+0

谢谢,它工作正常! @fredt,也谢谢你,看起来更简单 – Ivan 2013-05-10 09:29:01

+0

@fredt:谢谢你解决这个问题。这从手册来看对我来说并不明显。 – 2013-05-10 09:40:25