Составной первичный ключ H2 (поля получают уникальный, но не первичный ключ)
У меня проблема с составным первичным ключом в моей таблице базы данных h2. Это оператор создания таблицы:
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]
Как видите, столбец "Имя" больше не является частью первичного ключа, как я определил в операторе создания, и я не знаю почему. У меня есть эта проблема и в других таблицах, и добавление первичной таблицы с помощью alter table после ее создания решает ту же проблему. Когда "Имя" является первым столбцом в первичном ключе, он получает единственный столбец в первичном ключе, поэтому последние записи удаляются.
Я знаю, что одним из решений будет использование идентификаторов, но я хочу использовать составной первичный ключ, потому что я не хочу добавлять идентификаторы, когда это не нужно. Что-то не так с моим утверждением create или у вас есть какие-то другие советы?
PS я пробовал Версию 1.4.189 и 1.3.176 как.jar (без сервера)
Изменить: Хм, после вывода из столбцов шоу:
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|
Каким-то образом столбец Name и TTName являются UNI (уникальным), но не первичным ключом. если я изменяю порядок в объявлении первичного ключа, столбец TTName становится полем первичного ключа, но имя остается уникальным.