2017-01-31 53 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 
);