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