H2 数据库:从外键约束中引用根模式中的表

Posted

技术标签:

【中文标题】H2 数据库:从外键约束中引用根模式中的表【英文标题】:H2 database: referring to a table in root schema from a foreign key constraint 【发布时间】:2013-05-07 12:58:32 【问题描述】:

给定根模式中的表:

CREATE TABLE user (
    username VARCHAR(50),
    password VARCHAR(50));

Quiz 架构中的一个表:

CREATE TABLE Quiz.Results (
    username VARCHAR(50),
    points INT, 
    FOREIGN KEY (username) REFERENCES user(username));

我无法实际创建外键,因为数据库声称表 user 实际上并不存在。我也不能随后添加外键:

ALTER TABLE QUIZ.RESULTS
    ADD FOREIGN KEY (username) REFERENCES user (username) 

当然,两张表都存储在同一个数据库中。

由于这只是一个作业,我很乐意跳过添加外键。但我很好奇这是否确实是 H2 中的一个限制、一个错误,或者它是否按预期工作。

我可以在quiz 架构之外以某种方式引用表user 吗?

【问题讨论】:

【参考方案1】:

如果您引用不同架构中的表,则需要显式设置架构名称。 H2 的默认架构名称是 public。示例:

CREATE TABLE user (
    username VARCHAR(50),
    password VARCHAR(50));
create schema quiz;
CREATE TABLE Quiz.Results (
    username VARCHAR(50),
    points INT, 
    FOREIGN KEY (username) 
    REFERENCES public.user(username));

稍后要创建外键约束,请使用:

ALTER TABLE QUIZ.RESULTS
    ADD FOREIGN KEY (username) 
    REFERENCES public.user(username) ;

【讨论】:

了解默认架构(我称之为“根架构”)名称会有所帮助。谢谢! 我能问一下您为什么要添加两次FOREIGN KEY (username) 吗?您似乎在Quiz.Results 的表定义中添加了一次,然后在ALTER TABLE 语句中添加了第二次。 @CraigOtis 你是对的,应该是其中之一。我改变了答案。【参考方案2】:

是的,很有可能。您需要为两个表使用相应的模式名称。

假设您的默认架构名称是 DefaultSchema,那么您的查询将是

ALTER TABLE QUIZ.RESULTS
ADD FOREIGN KEY (username) REFERENCES DefaultSchema.user (username) 

【讨论】:

以上是关于H2 数据库:从外键约束中引用根模式中的表的主要内容,如果未能解决你的问题,请参考以下文章

如何修改数据库中主外键约束的数据?

判断子表外键约束参数类型

外键约束

如何在有外键关系的表中删除数据

MySQL插入数据因外键约束失败?

Oracle系统表外键的更名