I’ve been searching and tackling this for hours and I’m sure there’s a super easy way to do this.
I have two tables:
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) );
And in a third table, I want to make sure that the “program” is the same for the student and the branch.
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) );
The problem I run in to is that this tries to get the whole column from program in Students. I only want the value for said student not the whole column.
To clarify:
Students:
idnr | name | login | program -----+------+-------+----------- 1234 | bob | 1111 | prog1 2222 | tom | 2222 | prog2
Branches:
branch | program --------+--------- branch1 | prog1 branch2 | prog2 branch3 | prog1
Here Tom should only be able to enter the StudentBranches
table with B1 and B3, since he belongs to Prog1 that is a program for B1. And Bob can only enter to B2.
Advertisement
Answer
As I said in my comment, it’s hard to tell what you’re trying to do but the foreign keys you’ve tried to create definitely look fishy.
Everything should be easier to understand if you limit each table to represent 1 thing only, that is respectively:
- A student (without the attached program since that would be 2 things for the same table).
- A program/branch (whatever you call it)
- The link from a student to a branch.
This results in:
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) );
- To fetch the program a student as registered to, you have to JOIN with
StudentBranches
. - I have removed the
PRIMARY KEY
fromStudentBranches
because your previous comment about “get the whole column” sounded like a student should be able to register to more than 1 program. If a student can register to exactly 1 program, then you need to add it back.