Добавить ограничение для сравнения двух атрибутов разных таблиц? - PullRequest
0 голосов
/ 05 марта 2019

Вот мои столы.Мне нужно проверить, что атрибут 'program', на который ссылаются в StudentsBranch с таблицей Students и таблицей Branches, совпадает.Как я могу это сделать?

 CREATE TABLE Programmes (
    name            VARCHAR(200)   UNIQUE NOT NULL,
    CONSTRAINT pk_Programmes PRIMARY KEY (name)
);

CREATE TABLE Students (
    id              NUMERIC(10,0)  UNIQUE NOT NULL,
    program         VARCHAR(200)   NOT NULL,
    CONSTRAINT pk_Students PRIMARY KEY (idnr),
    FOREIGN KEY (program) REFERENCES Programmes(name)
);

CREATE TABLE Branches (
    name            VARCHAR(200)   UNIQUE NOT NULL,
    program         VARCHAR(200)   NOT NULL,
    CONSTRAINT pk_Branches PRIMARY KEY (name, program),
    FOREIGN KEY (program) REFERENCES Programmes(name)
);

CREATE TABLE StudentsBranch (
    student         NUMERIC(10,0)  NOT NULL,
    program         VARCHAR(200)   NOT NULL,
    branch          VARCHAR(200)   NOT NULL,
    CONSTRAINT pk_StudentsBranch PRIMARY KEY (student),
    /* Below how the foreign keys I think should be  */
    FOREIGN KEY (student, program) REFERENCES Students(idnr, program),
    FOREIGN KEY (branch, program) REFERENCES Branches(name, program)
    /* I need to add a constraint to verify that the 'program' in Students
     * and the 'program' in Branches are equivalent. How?
    */
);

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Вы не можете написать это ограничение для существующей модели базы данных, которая у вас есть сейчас.

Единственный способ, которым я вижу, что вы можете это сделать, - это изменить первичный ключ Students на (id)., program):

CREATE TABLE Students (
    id              NUMERIC(10,0)  UNIQUE NOT NULL,
    program         VARCHAR(200)   NOT NULL,
    CONSTRAINT pk_Students PRIMARY KEY (id, program),
    FOREIGN KEY (program) REFERENCES Programmes(name)
);

Тогда таблица StudentsBranch может естественным образом принудительно применять оба FK с использованием single column program, например:

CREATE TABLE StudentsBranch (
    student         NUMERIC(10,0)  NOT NULL,
    program         VARCHAR(200)   NOT NULL,
    branch          VARCHAR(200)   NOT NULL,
    CONSTRAINT pk_StudentsBranch PRIMARY KEY (student),
    FOREIGN KEY (student, program) REFERENCES Students (id, program),
    FOREIGN KEY (branch, program) REFERENCES Branches (name, program)
);
0 голосов
/ 05 марта 2019

Всегда полезно иметь числовой столбец первичного ключа и иметь первичный ключ для каждой таблицы. Если у вас есть первичный ключ для каждой таблицы, вы можете ссылаться на первичный ключ конкретной таблицы и ссылаться на него как на внешний ключ.

CREATE TABLE Programmes (
ID          INT,
name        VARCHAR(200)   UNIQUE NOT NULL,
CONSTRAINT pk_Programmes PRIMARY KEY (ID)
);

CREATE TABLE  Students(
id              INT,
ProgrammID  INT NOT NULL,
CONSTRAINT pk_Students PRIMARY KEY (ID),
FOREIGN KEY (ProgrammID) REFERENCES Programmes(ID)
);

CREATE TABLE Branches (
BranchID        INT,
ProgrammID  INT NOT NULL,
name            VARCHAR(200)   UNIQUE NOT NULL,
--program         VARCHAR(200)   NOT NULL,
CONSTRAINT pk_Branches PRIMARY KEY (BranchID, ProgrammID),
FOREIGN KEY (ProgrammID) REFERENCES Programmes(ID)
);

CREATE TABLE StudentsBranch (
StudentsBranchID    INT,
studentID           INT  NOT NULL,
ProgrammID          INT   NOT NULL,
BranchID            INT   NOT NULL,
CONSTRAINT pk_StudentsBranch PRIMARY KEY (StudentsBranchID),
FOREIGN KEY (ProgrammID) REFERENCES Programmes(id),
FOREIGN KEY (studentID) REFERENCES Students(id),
FOREIGN KEY (BranchID, ProgrammID) REFERENCES Branches(BranchID, ProgrammID)

);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...