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

如何在PostgreSQL中对被引用的表进行约束的外键

经和歌
2023-03-14
问题内容

假设我有以下表格

CREATE TABLE plugins (
id int primary key,
type text);

insert into plugins values (1,'matrix');
insert into plugins values (2,'matrix');
insert into plugins values (3,'function');
insert into plugins values (4,'function');

CREATE TABLE matrix_params (
id int primary key,
pluginid int references plugins (id)
);

所有这些都按预期工作,但是我想添加一个额外的约束,即matrix_param仅可以引用类型为’matrix’的pluginid。所以

insert into matrix_params values (1,1);

应该成功但是

insert into matrix_params values (2,3);

应该失败。

对matrix_params的简单约束不起作用,因为它无法知道插件表中的对应类型是什么。


问题答案:

您可以为此使用CHECK约束。您不能将查询置于CHECK约束中,但可以调用一个函数。因此,我们构建了一个简单的函数来告诉我们apluginid是否为矩阵:

create or replace function is_matrix(int) returns boolean as $$
    select exists (
        select 1
        from plugins
        where id   = $1
          and type = 'matrix'
    );
$$ language sql;

并将其包装在CHECK约束中:

alter table matrix_params add constraint chk_is_matrix check (is_matrix(pluginid));

然后:

=> insert into matrix_params values (1,1);
=> insert into matrix_params values (2,3);
ERROR:  new row for relation "matrix_params" violates check constraint "chk_is_matrix"

FK负责参照完整性和级联。



 类似资料:
  • 问题内容: 我有一个用户表,例如: 和一张有工作的桌子: 可以将作业分配给用户,但只能分配给超级用户。其他用户无法分配作业。 因此,我有一个表格,通过它可以查看将哪个作业分配给了哪个用户: 但是我想创建一个检查约束,该约束引用具有的用户。 那可能吗?还是有其他解决方案? 问题答案: 这将适用于INSERTS: 然后在user_has_job表上检查约束: 适用于插入物: 但是,这是可能的: 因此,

  • 我正在尝试运行一个Spring Boot应用程序,但我有这个问题,我不知道原因。请注意,我想使用的是Mysql,而不是H2数据库 我的受抚养人

  • 问题内容: 为什么没有一个 TRUNCATE 上工作?即使我知道了: 错误1701(42000):无法截断在外键约束中引用的表(。,CONSTRAINT FOREIGN KEY()参考。()) 问题答案: 您不能在上面应用FK约束的表(与相同)。 要变通解决此问题,使用这些解决方案之一。两者都存在破坏数据完整性的风险。 选项1: 消除约束 执行 手动删除现在 无处* 引用的行 * 创建约束 选项2

  • 问题内容: 在下表中输入值时,如何在SQL的同一表的列上强制使用外键约束: 员工人数 : 空号, 经理编号(必须是现有员工) 问题答案: 希望能帮助到你!

  • PostgreSQL 约束用于规定表中的数据规则。 如果存在违反约束的数据行为,行为会被约束终止。 约束可以在创建表时规定(通过 CREATE TABLE 语句),或者在表创建之后规定(通过 ALTER TABLE 语句)。 约束确保了数据库中数据的准确性和可靠性。 约束可以是列级或表级。列级约束仅适用于列,表级约束被应用到整个表。 以下是在 PostgreSQL 中常用的约束。 NOT NULL

  • 我创建了一个表(团队),它有一个由id、项目id和用户id组成的复合主键。每个主键引用除id之外的其他表中的一个键。现在我想添加一个键(团队id),该键引用团队自己的id,因为我想满足子团队的需求,该团队id将包含父团队的id。 我遇到了一个错误:“没有唯一的约束匹配引用表“team”的给定键。”。 复合主键中每个键的每个可能组合都是团队的唯一约束,我理解错了吗?我错过了什么?