#sql-server #database #foreign-keys #composite-primary-key #composite-key
#sql-server #База данных #внешние ключи #составной первичный ключ #составной ключ
Вопрос:
CREATE TABLE Person
(
PersonID int NOT NULL IDENTITY,
PersonName nvarchar(30) NOT NULL,
PersonSurname nvarchar(30) NOT NULL,
PRIMARY KEY (PersonID)
)
CREATE TABLE Author
(
AuthorID int NOT NULL IDENTITY,
PersonID int NOT NULL,
PRIMARY KEY (AuthorID),
FOREIGN KEY (PersonID) REFERENCES Person(PersonID)
)
CREATE TABLE Supervisor
(
SupervisorID int NOT NULL ,
PersonID int NOT NULL,
PRIMARY KEY (SupervisorID,PersonID),
FOREIGN KEY (PersonID) REFERENCES Person(PersonID)
)
CREATE TABLE University
(
UniversityID int NOT NULL IDENTITY,
UniversityName nvarchar(100) NOT NULL,
PRIMARY KEY (UniversityID)
)
CREATE TABLE Enstitute
(
EnstituteID int NOT NULL IDENTITY,
UniversityID int NOT NULL,
EnstituteName nvarchar(100),
PRIMARY KEY (EnstituteID),
FOREIGN KEY (UniversityID) REFERENCES University(UniversityID)
)
CREATE TABLE Thesis
(
ThesisNo numeric(8,0) NOT NULL IDENTITY,
AuthorID int NOT NULL,
EnstituteID int NOT NULL,
SupervisorID int NOT NULL,
Title nvarchar(100)NOT NULL,
Abstract nvarchar(500)NOT NULL,
Pages int NOT NULL,
SubmitDate datetime NOT NULL,
[Type] nchar(30) NOT NULL,
[Language] nchar(20) NOT NULL
PRIMARY KEY (ThesisNo),
FOREIGN KEY (EnstituteID) REFERENCES Enstitute(EnstituteID),
FOREIGN KEY (AuthorID) REFERENCES Author(AuthorID),
FOREIGN KEY (SupervisorID) REFERENCES Supervisor(SupervisorID)
)
CREATE TABLE Keywords
(
ThesisNo numeric(8,0) NOT NULL,
Keyword nvarchar(50) NULL,
FOREIGN KEY (ThesisNo) REFERENCES Thesis(ThesisNo)
)
CREATE TABLE Subjects
(
SubjectID int NOT NULL,
ThesisNo numeric(8,0) NOT NULL,
[Subject] nvarchar(120) NOT NULL,
PRIMARY KEY (SubjectID),
FOREIGN KEY (ThesisNo) REFERENCES Thesis(ThesisNo)
)
Я получаю эту ошибку:
Сообщение 1767, уровень 16, состояние 0, строка 38
Внешний ключ ‘FK__Thesis__AuthorID__47DBAE45’ ссылается на недопустимую таблицу ‘Author’.Сообщение 1750, уровень 16, состояние 1, строка 38
Не удалось создать ограничение или индекс. Смотрите предыдущие ошибки
Комментарии:
1. Используйте точки с запятой для завершения операторов
2.
Thesis
имеет FK toSupervisor
, но PK inSupervisor
имеет два столбца — если вы хотите ссылаться на это с помощью FK, вы ТАКЖЕ ДОЛЖНЫ указать оба столбца в дочерней таблице. Вы НЕ можете ссылаться только на часть PK — либо на все (каждый отдельный столбец), либо вы не можете ссылаться на него.3. Я пробовал это: ВНЕШНИЙ КЛЮЧ (SupervisorID) ССЫЛАЕТСЯ на супервизор (SupervisorID , PersonID), но это не работает. Произошла ошибка. @marc_s
4. Сторона внешнего ключа также должна состоять из двух столбцов. Однако в этом случае проще просто создать
Supervisor
один столбец как первичного, так и внешнего ключа (toPerson
)
Ответ №1:
Почему у супервизора есть составной ключ. Он выглядит как подтип Person и должен иметь ту же структуру ключей. например
CREATE TABLE Supervisor
(
PersonID int NOT NULL,
PRIMARY KEY (PersonID),
FOREIGN KEY (PersonID) REFERENCES Person(PersonID)
)
Автор тоже
CREATE TABLE Author
(
PersonID int NOT NULL,
PRIMARY KEY (PersonID ),
FOREIGN KEY (PersonID) REFERENCES Person(PersonID)
)
Хотя часто лучше просто иметь таблицу Person.
Комментарии:
1. У меня есть домашнее задание, и некоторые правила таковы: 2. Человек может быть автором более одной диссертации (например, человек может подготовить магистерскую диссертацию, позже он / она может подготовить докторскую диссертацию), 3. У диссертации может быть только один автор (в отличие от научных работ, нетв тезисах нет соавторства), 4. У диссертации должен быть хотя бы один руководитель, 5. У диссертации может быть не более двух руководителей (один руководитель и один со-руководитель), 6. Человек может руководить многими тезисами, поэтому я думаю, что для создания 2 супервизора я использовал compositeключ, но я думаю, что это ошибка. Что я должен делать..
2. Для этого вам не нужны отдельные таблицы Author или Supervisor.
3. Вы говорите, мне просто нужно создать таблицу person? Если я это сделаю, чтобы показать отношения, мне нужно 2 соединения отношений на диаграмме, верно? (между тезисом и человеком).
4. @vikbaris Только в том случае, если у тезиса может быть неопределенное количество супервизоров. В нашем случае вы можете просто создать два столбца в
Thesis
:Supervisor
иCo-supervisor
, хотя, если у вас вообще может быть больше, я бы создал таблицу соединений, как вы говорите.5.
Thiesis
:Supervisor
Co-Supervisor
(необязательно, может быть null) иAuthor
они создают изPerson