I have a table with multiple columns in its primary key.

CREATE TABLE GAV (
  GROUP_ID VARCHAR(255) NOT NULL,
  ARTIFACT_ID VARCHAR(255) NOT NULL,
  VERSION_ID VARCHAR(20) NOT NULL,
  CLASSIFIER VARCHAR(20) DEFAULT 'jar' NOT NULL
  PRIMARY KEY (GROUP_ID, ARTIFACT_ID, VERSION_ID, CLASSIFIER)
)


I'm seeing some very odd behavior where an attempt to MERGE INTO this table 
is bumping into a unique constraint violation—as though a unique constraint 
were defined on each individual column, rather than on the group of columns!

If I go into the mydb.mv.db file, my actual table definition stored in that 
file, minus some control characters and other binary stuff, is this:

CREATE CACHED TABLE PUBLIC.GAV(
    GROUP_ID VARCHAR(255) NOT NULL,
    ARTIFACT_ID VARCHAR(255) NOT NULL,
    VERSION_ID VARCHAR(20) NOT NULL,
    CLASSIFIER VARCHAR(20) DEFAULT 'jar' NOT NULL
)


Looks good so far.  Then I see:

CREATE PRIMARY KEY PUBLIC.PRIMARY_KEY_1 ON PUBLIC.GAV(GROUP_ID, 
ARTIFACT_ID, VERSION_ID, CLASSIFIER)


Also looks good.  And then:

ALTER TABLE PUBLIC.GAV ADD CONSTRAINT PUBLIC.CONSTRAINT_1 PRIMARY 
KEY(GROUP_ID, ARTIFACT_ID, VERSION_ID, CLASSIFIER) INDEX 
PUBLIC.PRIMARY_KEY_1


Great.  Everything looks fine.

Then, like I said, a part of my code does:

MERGE INTO GAV(GROUP_ID, ARTIFACT_ID, VERSION_ID, CLASSIFIER) VALUES(?, ?, 
?, ?)


...and I get:

Unique index or primary key violation: "CONSTRAINT_INDEX_112 *ON 
PUBLIC.GAV(VERSION_ID)* VALUES ('3.0.0.CR1', 1)"; SQL statement:
MERGE INTO GAV(GROUP_ID, ARTIFACT_ID, VERSION_ID, CLASSIFIER)         
VALUES(?, ?, ?, ?) [23505-193]


Huh?  I checked the four values; they're distinct from any other four 
values in the table.  This shouldn't be a primary key violation.

I couldn't find CONSTRAINT_INDEX_112 in the INFORMATION_SCHEMA.SYSTEM_TABLE 
area, so I looked back at the database file and found this oddness:

CREATE UNIQUE INDEX PUBLIC.CONSTRAINT_INDEX_112 *ON PUBLIC.GAV(VERSION_ID)*


What?  I didn't create this index.  I'm guessing it's an index that is 
automatically created for a foreign key that references the VERSION_ID 
column?

Indeed, I have another table that does this:

CREATE TABLE IF NOT EXISTS QUALIFICATION (
  GROUP_ID VARCHAR(255) NOT NULL REFERENCES GAV(GROUP_ID),
  ARTIFACT_ID VARCHAR(255) NOT NULL REFERENCES GAV(ARTIFACT_ID),
*  VERSION_ID VARCHAR(20) NOT NULL REFERENCES GAV(VERSION_ID),*
  CLASSIFIER VARCHAR(20) NOT NULL DEFAULT 'jar' REFERENCES GAV(CLASSIFIER),
  JAVA_TYPE_ID INT NOT NULL REFERENCES JAVA_TYPE(ID),
  QUALIFIER_ID INT NOT NULL REFERENCES QUALIFIER(JAVA_TYPE_ID),
  USAGE_ID CHAR NOT NULL REFERENCES USAGE(ID),
  PRIMARY KEY(GROUP_ID, ARTIFACT_ID, VERSION_ID, CLASSIFIER, JAVA_TYPE_ID, 
QUALIFIER_ID, USAGE_ID)
);


This all seems like reasonable DDL to me.  Is this a bug or am I doing 
something wrong?

I'm using H2 1.4.193 and Java 8.

-- 
You received this message because you are subscribed to the Google Groups "H2 
Database" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/h2-database.
For more options, visit https://groups.google.com/d/optout.

Reply via email to