SQL первичный ключ и внешний ключ - PullRequest
0 голосов
/ 27 марта 2020

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

Например: например, отношение персонала имеет SID первичного ключа (идентификатор студента) и в отдельном отношении (скажем, курс) имеет атрибут с именем «ученик», но содержит точно такие же компоненты, как SID. Как написать схему отношений для такого сценария?

1 Ответ

1 голос
/ 27 марта 2020

Насколько я понял вопрос, ответ на ваше первое предложение - «да, может». Неважно, как вы называете столбцы (я полагаю, что это «атрибуты» в вашем тексте); они должны совпадать в типе данных и - если составные - число столбцов (атрибутов).

Например (это Oracle; какую базу данных вы используете?): t_student является родительским таблица, для него установлен первичный ключ в столбце student_id:

SQL> create table t_student
  2    (student_id number       constraint pk_stu primary key,
  3     name       varchar2(30),
  4     birthdate  date
  5    );

Table created.

t_course - это таблица child . Его sid ссылка на столбец t_student.student_id столбец; они не совпадают по имени (это то, что вы просили), но - они также не совпадают по типу данных:

SQL> create table t_course
  2    (course_id  number       constraint pk_cou primary key,
  3     sid        varchar2(10) constraint fk_coustu references t_student(student_id),
  4     name       varchar2(20)
  5    );
   sid        varchar2(10) constraint fk_coustu references t_student(student_id),
   *
ERROR at line 3:
ORA-02267: column type incompatible with referenced column type

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

SQL> create table t_course
  2    (course_id  number       constraint pk_cou primary key,
  3     sid        number       constraint fk_coustu references t_student(student_id),
  4     name       varchar2(20)
  5    );

Table created.

SQL>
...