sql - 当主键在 sql 中已知时,如何对特定单元格进行外键引用?

标签 sql database postgresql

我已经搜索和解决这个问题几个小时了,我确信有一种 super 简单的方法可以做到这一点。

我有两个表:

CREATE TABLE Students 
(
    idnr            NUMERIC(10) PRIMARY KEY,
    name            TEXT        NOT NULL,
    login           TEXT        NOT NULL,
    program         TEXT        NOT NULL 
);

CREATE TABLE Branches
(
    name            TEXT,
    program         TEXT,
    PRIMARY KEY(name, program) 
);

在第三个表中,我想确保学生和分支机构的“程序”相同。

CREATE TABLE StudentBranches 
(
    student         NUMERIC(10) PRIMARY KEY REFERENCES Students(idnr),
    branch          TEXT        NOT NULL,
    program         TEXT        NOT NULL,
    FOREIGN KEY (branch, program) REFERENCES Branches(name, program),
    FOREIGN KEY (student, program) REFERENCES Students(idnr, program) 
);

我遇到的问题是,它试图从 Students 中的程序中获取整个列。我只想要所述学生的值(value),而不是整个专栏。

澄清一下:

学生们:

idnr | name | login | program
-----+------+-------+-----------
1234 | bob  | 1111  | prog1
2222 | tom  | 2222  | prog2

分支机构:

branch  | program
--------+---------
branch1 | prog1
branch2 | prog2
branch3 | prog1 

这里 Tom 应该只能进入包含 B1 和 B3 的 StudentBranches 表,因为他属于 B1 的程序 Prog1。 Bob只能进入B2。

最佳答案

正如我在评论中所说,很难说出您要做什么,但您尝试创建的外键肯定看起来很可疑。
如果您将每个表限制为仅代表一件事,那么一切都应该更容易理解,分别是:

  • 一个学生(没有附加程序,因为同一张 table 有两个东西)。
  • 一个程序/分支(无论你怎么调用它)
  • 从学生到分支机构的链接。

这导致:

CREATE TABLE Students (
    idnr            NUMERIC(10) PRIMARY KEY,
    name            TEXT        NOT NULL,
    login           TEXT        NOT NULL
);

CREATE TABLE Branches(
    name            TEXT,
    program         TEXT,
    PRIMARY KEY(name, program)
);

CREATE TABLE StudentBranches (
    student         NUMERIC(10) REFERENCES Students(idnr),
    branch          TEXT        NOT NULL,
    program         TEXT        NOT NULL,
    FOREIGN KEY (branch, program) REFERENCES Branches(name, program)
);
  • 要获取学生注册的类(class),您必须使用 StudentBranches 加入。
  • 我已经从 StudentBranches 中删除了 PRIMARY KEY,因为您之前关于“获取整个专栏”的评论听起来像是学生应该能够注册到多个程序.如果一个学生只能注册 1 个类(class),那么您需要将其添加回去。

关于sql - 当主键在 sql 中已知时,如何对特定单元格进行外键引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54976356/

相关文章:

sql - Pentaho执行SQL语句变量转换为null

sql - 组合索引是否仅适用于一列查询?

c# - Asp.net MVC 休眠 : Can not modify more than one base table through a join view

sql - CTE 删除未提交,直到以下语句完成

python - Ident 连接通过 psycopg2 失败,但通过命令行工作

qt - 使用 QSqlDatabase 使用 "cert"身份验证方法连接到 PostgreSQL 服务器

php - 循环过多的 SQL 查询

sql - psql onDelete : cascade not working 的 Sequelize

php - 需要有关使用 PHP 在 mysql 数据库中插入逗号分隔数据的帮助

javascript - 在 MongoDB 聚合框架中使用 $avg 函数似乎不会改变返回值