Как сделать ссылку внешнего ключа на конкретную ячейку, если первичный ключ известен в sql? - PullRequest
0 голосов
/ 04 марта 2019

Я искал и занимался этим часами, и я уверен, что есть супер простой способ сделать это.

У меня есть две таблицы:

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 

Здесь Том должен иметь возможность войти в таблицу StudentBranches только с B1 и B3, поскольку он принадлежит к Prog1, которая является программой для B1.И Боб может войти только в B2.

Ответы [ 2 ]

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

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

  • Студент (без прилагаемой программы, так как это будет 2 вещи для одной таблицы).
  • Программа / филиал (независимо от того, что выназовите это)
  • Ссылка от студента на филиал.

Это приводит к:

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, потому что ваш предыдущий комментарий о «получить весь столбец» звучал так, как будто студент должен иметь возможность зарегистрироваться наболее 1 программы.Если студент может зарегистрироваться ровно в 1 программе, вам нужно добавить его обратно.
0 голосов
/ 04 марта 2019

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

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