H2复合主键(字段变为唯一但不是主键)

时间:2015-09-15 09:16:30

标签: database primary-key h2 composite-primary-key

我的h2数据库表中存在复合主键的问题。 这是表的create语句:

 CREATE TABLE IF NOT EXISTS TTColumn (  
    Name VARCHAR(15) NOT NULL,  
    TTName CHAR(8) NOT NULL,  
    Type VARCHAR(15) NOT NULL,  
    Length INTEGER NOT NULL,  
    Position INTEGER NOT NULL,  
    IsDBLogType BIT NOT NULL,   
    PRIMARY KEY(TTName,Name),   
    FOREIGN KEY(TTName) REFERENCES TrackingTable(Name))  

(TTName是列的表的名称,因此对于表的每一列它是相同的,但每个列在表中是唯一的,因此它是一个复合键)
如果我用数据填充此表,我会得到以下异常

rg.h2.jdbc.JdbcSQLException: Eindeutiger Index oder Primärschlüssel verletzt: "CONSTRAINT_INDEX_E8 ON PUBLIC.TTCOLUMN(TTNAME) VALUES ('KIBLCOVI', 1)"
Unique index or primary key violation: "CONSTRAINT_INDEX_E8 ON PUBLIC.TTCOLUMN(TTNAME) VALUES ('KIBLCOVI', 1)"; SQL statement:
INSERT INTO TTColumn (Name,TTName,Type,Length,Position,IsDBLogType) VALUES (?,?,?,?,?,?) [23505-189] 

正如您所看到的,“Name”列不再是主键的一部分,就像我在create语句中定义的那样,我不知道为什么。 我在其他表中也有这个问题,并且在创建它之后添加主表和alter table,解决了同样的问题。当“Name”是主键中的第一列时,它将获得主键中的唯一列,因此最后一次删除将被删除。

我知道,一个解决方案是使用id,但我想使用复合主键,因为我讨厌在不需要时添加id。 我的create语句有什么问题,或者你有其他任何提示吗?

P.S。我尝试将版本1.4.189和版本1.3.176作为.jar(无服务器)

编辑: 嗯,按照show栏的输出:

NAME|VARCHAR(15)|NO|UNI|NULL|  
TTNAME|CHAR(8)|NO|UNI|NULL|  
TYPE|VARCHAR(15)|NO||NULL|  
LENGTH|INTEGER(10)|NO||NULL|  
POSITION|INTEGER(10)|NO||NULL|  
ISDBLOGTYPE|BOOLEAN(1)|NO||NULL| 

以某种方式,列名称和TTName是UNI(唯一)但不是主键。 如果我更改了主键声明中的顺序,则TTName列成为主键字段,但Name保持唯一。

0 个答案:

没有答案