相关疑难解决方法(0)

CONSTRAINT检查远程相关表中的值(通过连接等)

我想添加一个约束来检查相关表中的值.

我有3张桌子:

CREATE TABLE somethink_usr_rel (
    user_id BIGINT NOT NULL,
    stomethink_id BIGINT NOT NULL
);

CREATE TABLE usr (
    id BIGINT NOT NULL,
    role_id BIGINT NOT NULL
);

CREATE TABLE role (
    id BIGINT NOT NULL,
    type BIGINT NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

(如果你想让我对FK施加约束,请告诉我.)

我想补充一个约束somethink_usr_rel,检查typerole("两个表走"),例如:

ALTER TABLE somethink_usr_rel
    ADD CONSTRAINT CH_sm_usr_type_check 
    CHECK (usr.role.type = 'SOME_ENUM');
Run Code Online (Sandbox Code Playgroud)

我尝试用JOINs 做但没有成功.知道如何实现它吗?

postgresql database-design referential-integrity constraints foreign-keys

20
推荐指数
2
解决办法
1万
查看次数

PostgreSQL可以对数组元素有唯一性约束吗?

我正在尝试为当前在LDAP存储中的主机数据提出PostgreSQL架构.部分数据是机器可以拥有的主机名列表,该属性通常是大多数人用来查找主机记录的关键.

我想将这些数据移动到RDBMS的一件事是能够在hostname列上设置唯一性约束,以便无法分配重复的主机名.如果主机只能有一个名称,这将很容易,但由于它们可以有多个名称,因此它更复杂.

我意识到这样做的完全规范化的方法是让一个主机名表的外键指向hosts表,但是我想避免让每个人都需要为最简单的查询做连接:

select hostnames.name,hosts.*
  from hostnames,hosts
 where hostnames.name = 'foobar'
   and hostnames.host_id = hosts.id;
Run Code Online (Sandbox Code Playgroud)

我认为使用PostgreSQL数组可以为此工作,它们肯定使简单的查询变得简单:

select * from hosts where names @> '{foobar}';
Run Code Online (Sandbox Code Playgroud)

但是,当我在hostnames属性上设置唯一性约束时,它当然会将整个名称列表视为唯一值而不是每个名称.有没有办法让每个名称在每一行都是唯一的?

如果没有,有没有人知道另一种更有意义的数据建模方法?

arrays postgresql database-design ldap unique-constraint

19
推荐指数
2
解决办法
6956
查看次数

触发与检查约束

我想在表上添加字段级验证.有一个名为"account_number"的字段,该字段应始终通过"luhn"检查.我发现了一个名为"luhn_verify"的功能似乎正常工作(谷歌如果你感兴趣的话).它返回一个布尔值.我的问题是:

在PostgreSQL中使用触发器进行此验证与检查约束是否有任何主要的性能优势.

附加信息:

  • PostgreSQL 9.1
  • Table当前没有插入触发器,但确实有更新.

免责声明:

我觉得这可能已经得到了解答,但我似乎找不到明确的答案.如果是,请标记为重复并参考原始问题/答案.

可能是dba板的更好问题.

postgresql triggers database-design check-constraints postgresql-9.1

6
推荐指数
1
解决办法
3945
查看次数