当前位置: 首页 > 面试题库 >

多个表的唯一约束

劳和雅
2023-03-14
问题内容

假设我们有这些表:

CREATE TABLE A (
    id SERIAL NOT NULL PRIMARY KEY
);
CREATE TABLE B (
    id SERIAL NOT NULL PRIMARY KEY
);
CREATE TABLE Parent (
    id SERIAL NOT NULL PRIMARY KEY,
    aId INTEGER NOT NULL REFERENCES A (id),
    bId INTEGER NOT NULL REFERENCES B (id),
    UNIQUE(aId, bId)
);
CREATE TABLE Child (
    parentId INTEGER NOT NULL REFERENCES Parent (id),
    createdOn TIMESTAMP NOT NULL
);

是否有可能在上创建唯一约束,Child使得对于Child最多一个引用中的所有行,Parent其值都为aId??陈述另一种方法,我可以创建一个唯一约束,以便上述表的连接没有重复项aId吗?我没有考虑-
我可以找到的每个数据库的语法似乎都与每个约束都限制在一个表上-
但这可能是我缺乏想象力的原因。(当然,去规范化以包含aIdonChild是一种解决方案。)


问题答案:

您可以尝试以下方法。您必须(id, aId)在Parent中创建一个冗余的UNIQUE约束(SQL非常愚蠢,不是吗?!)。

CREATE TABLE Child
(parentId INTEGER NOT NULL,
 aId INTEGER NOT NULL UNIQUE,
FOREIGN KEY (parentId,aId) REFERENCES Parent (id,aId),
createdOn TIMESTAMP NOT NULL);

可能更好的解决方案是将子表中的parentId完全删除,bId改为添加,然后基于引用父表(aId, bId)

CREATE TABLE Child
(aId INTEGER NOT NULL UNIQUE,
 bId INTEGER NOT NULL,
FOREIGN KEY (aId,bId) REFERENCES Parent (aId,bId),
createdOn TIMESTAMP NOT NULL);

有什么原因使您无法做到这一点?



 类似资料:
  • 问题内容: 有没有一种方法可以使用JPA指定在不同的列集上应该有多个唯一约束? 我已经看到了特定于hibernate的注释,但是由于我们仍在确定hibernate和数据核之间的关系,因此我试图避免使用特定于供应商的解决方案。 问题答案: 所述的属性实际接受的这些阵列。您的示例只是具有单个元素的数组的简写。否则,它看起来像: 只要唯一性约束仅基于一个字段,就可以在该列上使用。

  • 问题内容: 我正在将SEAM 2 / Hibernate与PostgreSQL 9数据库一起使用。我有下表 我想添加一个约束,以确保每个新条目都具有active_band_user和active_band_date的唯一组合。 每秒可能有许多次尝试插入,因此我需要尽可能地提高效率,是否可以在实体映射中使用SEAM /hibernate注释? 提前致谢 问题答案: 没有Hibernate注释在插入/

  • 我的桌子有两个独特的列: 我想写保存或更新方法 My jooq code: 但我遇到了异常: “错误:没有唯一或排除约束匹配ON CONFLICT规范” 请帮助。

  • 问题内容: 我有两个表->变量(id,名称)和Variable_Entries(id,var_id,值)。 我希望每个变量都具有唯一的一组条目。如果我使值条目唯一,那么其他变量将无法具有相同的值,这是不正确的。 有什么办法可以使相同的var_id的value列唯一? 问题答案: 是的: 现在,您对var_id和value有了唯一的约束。换句话说,var_id和value的出现不能出现多次。

  • 问题内容: 以下代码适用于,它是否也返回重复的笛卡尔积,如果是,如何获得唯一的笛卡尔积? 当我传递包含列表的列表时,这似乎也不起作用 问题答案: 要仅获取唯一元素,可以使用这样的set表示法( 注意: 这不能保证顺序) 或根据Paul Draper的评论,我们可以像这样 如果您也想维护订单 要使您的程序可以使用列表列表,只需将函数声明从 至

  • 问题内容: 给定Postgres数据库中的以下三列:第一,第二,第三;我如何创建一个约束使得排列是唯一的? 例如,如果数据库中存在,则将其作为非唯一变量排除在外。 问题答案: 您可以使用hstore创建唯一索引: 更新 实际上