2017-01-31 55 views
0

我有一個任務,我必須SQL服務器:約束和外鍵

  1. 創建特定情況的實體關係圖,並
  2. 寫了SQL代碼來表示圖

我是SQL Server的新手,但我有一個表class,它有一個主鍵CRN varchar(10)(UNN)和兩個外鍵,emp_id varchar(20) (NN),它與教師有一個強制關係,room_number varchar(5) (UNN)也有一個與Classroom有1強制關係。

我的表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) 
); 

我得到的錯誤是:

約束 「FK_CLASS」 已經存在; SQL語句:
CREATE TABLE類
(CRN VARCHAR(10)UNSIGNED NOT NULL,
EMP_ID VARCHAR(20),
room_number VARCHAR(5),
招生SMALLINT UNSIGNED NOT NULL,
約束pk_class PRIMARY KEY (CRN),
約束fk_class外鍵(EMP_ID)參考指導員(EMP_ID),
約束fk_class外鍵(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 
);