2017-01-31 8 views
0

У меня есть задание, где я долженSQL Server: ограничения и внешние ключи

  1. создать объект отношений схему конкретной ситуации, и
  2. Напишите код SQL для представления на диаграмме

Я новичок в SQL Server, но у меня есть таблица class, которая имеет первичный ключ CRN varchar(10)(UNN) и два внешних ключа, emp_id varchar(20) (NN), который имеет 1 обязательную связь с преподавателем и room_number varchar(5) (UNN), который также имеет 1 обязательная связь с Classroom.

Мой код таблицы Class:

CREATE TABLE class 
(
    CRN varchar(10) UNSIGNED NOT NULL, 
    emp_id varchar(20), 
    room_number varchar(5), 
    enrollment smallint UNSIGNED NOT NULL, 

    CONSTRAINT pk_class PRIMARY KEY (CRN), 
    CONSTRAINT fk_class 
     FOREIGN KEY (emp_id) REFERENCES instructor (emp_id), 
    CONSTRAINT fk_class 
     FOREIGN KEY (room_number) REFERENCES classroom (room_number) 
); 

Ошибка я получаю:

Constraint "FK_CLASS" уже существует; SQL заявление:
CREATE класс TABLE
(CRN VARCHAR (10) UNSIGNED NOT NULL,
emp_id VARCHAR (20),
room_number VARCHAR (5),
регистрации SMALLINT UNSIGNED NOT NULL,
Constraint pk_class PRIMARY KEY (CRN),
CONSTRAINT fk_class FOREIGN KEY (emp_id) СПРАВОЧНЫЙ инструктор (emp_id),
CONSTRAINT fk_class FOREIGN KEY (room_number) Список литературы (класс room_number)) [90045-193]

Я видел много разных примеров того, как сделать таблицу двумя внешними ключами, но не повезло. Что я делаю не так?

+1

Каждого ограничения должно иметь уникальное имя, так же, как каждая таблица должна иметь уникальное имя. Может быть, что-то вроде fk_class_emp_id и fk_class_room_number? –

+1

Вам нужно уникальное имя для каждого первичного ключа и ограничения внешнего ключа. Вы назвали оба ограничения внешнего ключа одинаковыми. Таким образом, ошибка. Ваши имена в общем-то дороги, слишком расплывчатые и общие. Но в частности, ваши имена FK должны указывать на то, что отношения FK ... FK_class_instructor, а FK_class_classroom - возможные предложения. – pmbAustin

ответ

3

Противопоказания должны иметь уникальное имя, и вы используете имя fk_class дважды. Таким образом, именовать один fk_instructor, а другой fk_classroom должен решить проблему.

Обратите внимание, что есть более короткие нотации, что позволяет избежать таких проблем:

CREATE TABLE class (
    CRN varchar(10) PRIMARY KEY, 
    emp_id varchar(20) references instructor (emp_id), 
    room_number varchar(5) REFERENCES classroom (room_number), 
    enrollment smallint UNSIGNED NOT NULL 
);