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 数据库:从外键约束中引用根模式中的表的主要内容,如果未能解决你的问题,请参考以下文章