创建带外键的H2数据库报错:无法找到Turmas表
问题原因与解决方案
问题根源
你遇到的找不到Turmas表的问题,核心是H2数据库对标识符大小写的处理规则导致的匹配失败:
- 创建Turmas表时,表名没有用双引号包裹,H2默认会将无引号的标识符转为大写存储,实际数据库里的表名是
TURMAS。 - 但在创建Provas表的外键约束时,你用了
REFERENCES "Turmas",带双引号的标识符是严格区分大小写的,H2会去查找名为Turmas(首字母大写、其余小写)的表,自然找不到实际存在的TURMAS表。
解决方案
有两种方式可以解决这个问题,选一种即可:
方案1:统一使用无引号标识符(推荐)
去掉所有标识符的双引号,H2会自动处理大小写,确保外键引用能匹配上:
create table Turmas ( id_turmas identity PRIMARY KEY, nome varchar(50), periodo VARCHAR(10) ); CREATE TABLE Provas ( id_provas SERIAL PRIMARY KEY, nome VARCHAR(15) NULL, data VARCHAR(45) NULL, Turmas_id_turmas INT, CONSTRAINT fk_Provas_Turmas1 FOREIGN KEY (Turmas_id_turmas) REFERENCES Turmas (id_turmas) );
方案2:统一使用带双引号的标识符
如果必须保留双引号,要保证创建表和外键引用时的表名、字段名大小写完全一致:
create table "Turmas" ( "id_turmas" identity PRIMARY KEY, "nome" varchar(50), "periodo" VARCHAR(10) ); CREATE TABLE "Provas" ( "id_provas" SERIAL PRIMARY KEY, "nome" VARCHAR(15) NULL, "data" VARCHAR(45) NULL, "Turmas_id_turmas" INT, CONSTRAINT "fk_Provas_Turmas1" FOREIGN KEY ("Turmas_id_turmas") REFERENCES "Turmas" ("id_turmas") );
内容的提问来源于stack exchange,提问作者Nicholas Uchoa
相关产品推荐
相关产品推荐

