为 2 个外键更改 table 时 H2 失败(MYSQL 语法)
H2 fails when altering table for 2 foreign keys (MYSQL syntax)
正在为使用 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)
在测试中,以下两种情况都是成功的..
-- 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对同时添加多个外键有限制吗?
这不是H2的限制。在 SQL 标准中,您不能在 ALTER TABLE
语句中一次定义多个约束,您只能在 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,有自己的供应商特定语法,但这种语法与其他数据库不兼容,包括 H2(即使在 MySQL 兼容模式下)。
正在为使用 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)
在测试中,以下两种情况都是成功的..
-- 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对同时添加多个外键有限制吗?
这不是H2的限制。在 SQL 标准中,您不能在 ALTER TABLE
语句中一次定义多个约束,您只能在 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,有自己的供应商特定语法,但这种语法与其他数据库不兼容,包括 H2(即使在 MySQL 兼容模式下)。