首页 > 解决方案 > 我们可以更新定义为在不同表中定义的唯一记录的外键的记录吗?

问题描述

我是 PostgreSQL 的新手,我如何更新与外键定义相关的记录。我遇到了一个错误,如果您能提供任何提示指导我,那就太好了假设我们有两个不同的表格,如下所示:

CREATE TABLE IF NOT EXISTS student
(
    id_num        VARCHAR(40) NOT NULL REFERENCES registered(student_id),
    first_name             VARCHAR(32) NOT NULL,
    last_name              VARCHAR(32) NOT NULL,
    birthdate              DATE NOT NULL,

    PRIMARY KEY(id_num)
);

CREATE TABLE IF NOT EXISTS registered
(
    student_id        VARCHAR(40) NOT NULL UNIQUE,
    paid_tuition             BOOL NOT NULL,
    
    PRIMARY KEY(paid_tuition)
);

根据我的理解,我需要填写注册表,然后尝试将值插入到学生表中,使其 id 与注册表中的 student_id 值匹配。但是当我尝试它时,我得到以下错误?

有什么想法或建议吗?

消息:“更新或删除表“注册”违反了表“学生”上的外键约束“student_id_num_id_fkey”,详细信息:“键(id_num)=(idNum-1)仍然从表“学生”中引用。”,提示:"", Position:0, InternalPosition:0, InternalQuery:"", Where:"", SchemaName:"", TableName:"student", ColumnName:"", DataTypeName:"", ConstraintName:"student_id_num_id_fkey", File :“ri_triggers.c”,行:2490,例程:“ri_ReportViolation”}

标签: sqlpostgresqlsql-update

解决方案


似乎您正在以相反的方向链接表格,对我来说,“注册”表格已通过 fk studentid 链接到学生表格更有意义。同样在您的“学生”表定义中,您说“id”列是主键,而没有声明“id”列。

所以这就是我的意思:

CREATE TABLE IF NOT EXISTS student
(
    id_num        VARCHAR(40) NOT NULL REFERENCES registered(student_id),
    first_name             VARCHAR(32) NOT NULL,
    last_name              VARCHAR(32) NOT NULL,
    birthdate              DATE NOT NULL,
    PRIMARY KEY(id_num)
);

CREATE TABLE IF NOT EXISTS registered
(
    student_id        VARCHAR(40) NOT NULL REFERENCES student(id_num)
    paid_tuition             BOOL NOT NULL,
    PRIMARY KEY(id_num)
);

推荐阅读