Ошибка H2 при изменении таблицы для 2 внешних ключей (синтаксис MYSQL) - PullRequest
0 голосов
/ 17 марта 2020

Работает над добавлением тестирования в существующий проект, который использует Flyway. Таблицы находятся в версионных файлах, поэтому они не могут измениться, но пытаются выяснить причину этого базового варианта использования.

CREATE TABLE table1
(
    id LONG PRIMARY KEY AUTO_INCREMENT
);

CREATE TABLE table2
(
    id LONG PRIMARY KEY AUTO_INCREMENT
);

CREATE TABLE table3
(
    id LONG PRIMARY KEY AUTO_INCREMENT,
    t1_id LONG,
    t2_id LONG
);

ALTER TABLE table3
    ADD FOREIGN KEY (t1_id) REFERENCES table1 (id),
    ADD FOREIGN KEY (t2_id) REFERENCES table2 (id);

Причины:

SQL State  : 42000
Error Code : 42000
Message    : Syntax error in SQL statement "ALTER TABLE TABLE3
    ADD FOREIGN KEY (T1_ID) REFERENCES TABLE1 (ID),[*]
    ADD FOREIGN KEY (T2_ID) REFERENCES TABLE2 (ID)"; SQL statement:
ALTER TABLE table3
    ADD FOREIGN KEY (t1_id) REFERENCES table1 (id),
    ADD FOREIGN KEY (t2_id) REFERENCES table2 (id) [42000-200]
Location   : db/migration/V1_0__init.sql ...V1_0__init.sql)
Line       : 18
Statement  : ALTER TABLE table3
    ADD FOREIGN KEY (t1_id) REFERENCES table1 (id),
    ADD FOREIGN KEY (t2_id) REFERENCES table2 (id)

В тестировании следующие два сценария ios успешны, хотя ..

-- Only 1 foreign key
ALTER TABLE table3
    ADD FOREIGN KEY (t1_id) REFERENCES table1 (id);

-- Inlined foreign keys in table creation
CREATE TABLE table3
(
    id LONG PRIMARY KEY AUTO_INCREMENT,
    t1_id LONG,
    t2_id LONG,

    FOREIGN KEY (t1_id) REFERENCES table1 (id),
    FOREIGN KEY (t2_id) REFERENCES table2 (id)
);

Есть ли ограничение в H2 для добавления нескольких внешних ключей одновременно?

1 Ответ

1 голос
/ 17 марта 2020

Это не ограничение Н2. В стандарте SQL вы не можете определить несколько ограничений одновременно в операторе ALTER TABLE, вы можете определить их все сразу только в определении таблицы. Если они еще не были определены в команде CREATE TABLE, вам необходимо использовать две отдельные команды ALTER TABLE:

ALTER TABLE table3
    ADD FOREIGN KEY (t1_id) REFERENCES table1 (id);
ALTER TABLE table3
    ADD FOREIGN KEY (t2_id) REFERENCES table2 (id)

Некоторые базы данных, такие как MySQL, имеют свою собственную спецификацию поставщика c синтаксис, но такой синтаксис не совместим с другими базами данных, включая H2 (даже в режиме совместимости MySQL).

...