SQL Server-添加主键和外键

SQL Server-添加主键和外键,sql,sql-server,Sql,Sql Server,我有一个查询创建了几个表,如下所示,还有一个查询应该为每个表添加主键和外键。但是,当我尝试执行查询时,会收到以下错误消息: 味精1776,第16级,状态0,第2行 被引用的表“DEPARTMENT”中没有与外键“FK__EMPLOYEE__dno__25869641”中的引用列列表匹配的主键或候选键 Msg 1750,第16级,第0状态,第2行 无法创建约束。请参阅前面的错误 我不确定这意味着什么,因为我已经研究了主键和外键。有谁能给我指出解决这个问题的正确方向吗?谢谢!:) 主键列应不可为nu

我有一个查询创建了几个表,如下所示,还有一个查询应该为每个表添加主键和外键。但是,当我尝试执行查询时,会收到以下错误消息:

味精1776,第16级,状态0,第2行
被引用的表“DEPARTMENT”中没有与外键“FK__EMPLOYEE__dno__25869641”中的引用列列表匹配的主键或候选键

Msg 1750,第16级,第0状态,第2行
无法创建约束。请参阅前面的错误

我不确定这意味着什么,因为我已经研究了主键和外键。有谁能给我指出解决这个问题的正确方向吗?谢谢!:)


主键列应不可为null。对于所有PK,表定义不应为null

CREATE TABLE EMPLOYEE (
    fname       varchar(100),
    minit       char(1),
    lname       varchar(100),
    ssn         char(9) not null,
    bdate       date,
    addr        varchar(100),
    sex         char(1),
    salary      int,
    super_ssn   char(9),
    dno         int
);

CREATE TABLE DEPARTMENT (
    dname           varchar(100),
    dnumber         int not null,
    mgr_ssn         char(9),
    mgr_start_date  date
);

CREATE TABLE DEPENDENTS (
    essn            char(9) not null,
    dependent_name  varchar(100) not null,
    sex             char(1),
    bdate           date,
    relationship    varchar(100)
);

CREATE TABLE DEPT_LOCATIONS (
    dnumber         int not null,
    dlocation       varchar(100) not null
);

CREATE TABLE PROJECT (
    pname       varchar(100),
    pnumber     int not null,
    plocation   varchar(100),
    dnum        int
);

CREATE TABLE WORKS_ON (
    essn    char(9) not null,
    pno     int not null,
    hrs     float
);

ALTER TABLE EMPLOYEE ADD PRIMARY KEY(ssn);
ALTER TABLE DEPARTMENT ADD PRIMARY KEY(dnumber);
ALTER TABLE EMPLOYEE ADD FOREIGN KEY(super_ssn) REFERENCES EMPLOYEE(ssn);
ALTER TABLE EMPLOYEE ADD FOREIGN KEY(dno) REFERENCES DEPARTMENT(dnumber);


ALTER TABLE DEPARTMENT ADD FOREIGN KEY(mgr_ssn) REFERENCES EMPLOYEE(ssn);

ALTER TABLE DEPT_LOCATIONS ADD PRIMARY KEY(dnumber, dlocation);
ALTER TABLE DEPT_LOCATIONS ADD FOREIGN KEY(dnumber) REFERENCES DEPARTMENT(dnumber);

ALTER TABLE PROJECT ADD PRIMARY KEY(pnumber);
ALTER TABLE PROJECT ADD FOREIGN KEY(dnum) REFERENCES DEPARTMENT(dnumber);

ALTER TABLE WORKS_ON ADD PRIMARY KEY(essn, pno); 
ALTER TABLE WORKS_ON ADD FOREIGN KEY(essn) REFERENCES EMPLOYEE(ssn);
ALTER TABLE WORKS_ON ADD FOREIGN KEY(pno) REFERENCES PROJECT(pnumber);

ALTER TABLE DEPENDENTS ADD PRIMARY KEY(essn, dependent_name);
ALTER TABLE DEPENDENTS ADD FOREIGN KEY(essn) REFERENCES EMPLOYEE(ssn);

主键列应不可为null。例如,应该更改change Employee表ssn char(9),因为ssn char(9)not null
ssn
对于PK来说是一个非常糟糕的选择,因为它不能保证是唯一的!可能有重复的@marc_s:在加拿大和美国,使用SSN作为唯一标识符也是非法的。
CREATE TABLE EMPLOYEE (
    fname       varchar(100),
    minit       char(1),
    lname       varchar(100),
    ssn         char(9) not null,
    bdate       date,
    addr        varchar(100),
    sex         char(1),
    salary      int,
    super_ssn   char(9),
    dno         int
);

CREATE TABLE DEPARTMENT (
    dname           varchar(100),
    dnumber         int not null,
    mgr_ssn         char(9),
    mgr_start_date  date
);

CREATE TABLE DEPENDENTS (
    essn            char(9) not null,
    dependent_name  varchar(100) not null,
    sex             char(1),
    bdate           date,
    relationship    varchar(100)
);

CREATE TABLE DEPT_LOCATIONS (
    dnumber         int not null,
    dlocation       varchar(100) not null
);

CREATE TABLE PROJECT (
    pname       varchar(100),
    pnumber     int not null,
    plocation   varchar(100),
    dnum        int
);

CREATE TABLE WORKS_ON (
    essn    char(9) not null,
    pno     int not null,
    hrs     float
);

ALTER TABLE EMPLOYEE ADD PRIMARY KEY(ssn);
ALTER TABLE DEPARTMENT ADD PRIMARY KEY(dnumber);
ALTER TABLE EMPLOYEE ADD FOREIGN KEY(super_ssn) REFERENCES EMPLOYEE(ssn);
ALTER TABLE EMPLOYEE ADD FOREIGN KEY(dno) REFERENCES DEPARTMENT(dnumber);


ALTER TABLE DEPARTMENT ADD FOREIGN KEY(mgr_ssn) REFERENCES EMPLOYEE(ssn);

ALTER TABLE DEPT_LOCATIONS ADD PRIMARY KEY(dnumber, dlocation);
ALTER TABLE DEPT_LOCATIONS ADD FOREIGN KEY(dnumber) REFERENCES DEPARTMENT(dnumber);

ALTER TABLE PROJECT ADD PRIMARY KEY(pnumber);
ALTER TABLE PROJECT ADD FOREIGN KEY(dnum) REFERENCES DEPARTMENT(dnumber);

ALTER TABLE WORKS_ON ADD PRIMARY KEY(essn, pno); 
ALTER TABLE WORKS_ON ADD FOREIGN KEY(essn) REFERENCES EMPLOYEE(ssn);
ALTER TABLE WORKS_ON ADD FOREIGN KEY(pno) REFERENCES PROJECT(pnumber);

ALTER TABLE DEPENDENTS ADD PRIMARY KEY(essn, dependent_name);
ALTER TABLE DEPENDENTS ADD FOREIGN KEY(essn) REFERENCES EMPLOYEE(ssn);