我已经搜索和解决这个问题几个小时了,我确信有一种 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/