我已经搜索和处理这个问题好几个小时了,我相信有一个超级简单的方法可以做到这一点。
我有两张桌子:
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)
);
我遇到的问题是,这篇文章试图从学生课程中获取整个专栏。我只想要那个学生的价值,而不是整个专栏。
澄清:
学生:
idnr | name | login | program
-----+------+-------+-----------
1234 | bob | 1111 | prog1
2222 | tom | 2222 | prog2
分支机构:
branch | program
--------+---------
branch1 | prog1
branch2 | prog2
branch3 | prog1
在这里,Tom应该只能输入带有B1和B3的
StudentBranches
表,因为他属于Prog1,Prog1是B1的程序。鲍勃只能进入B2。 最佳答案
正如我在评论中所说,很难说你想做什么,但是你试图创建的外键看起来确实很可疑。
如果将每个表限制为仅表示一件事(即分别表示:
一个学生(没有附加的程序,因为那将是同一张桌子的两件事)。
一个程序/分支(不管你叫它什么)
从一个学生到一个分支的连接。
这将导致:
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)
);
要获取学生注册的程序,您必须加入
StudentBranches
。我已经把
PRIMARY KEY
从StudentBranches
中删除了,因为你之前关于“获取整个专栏”的评论听起来像是一个学生应该能够注册多个程序。如果一个学生可以注册一个程序,那么你需要把它加回去。