SQL Server外键引用无效表'员工'

时间:2016-10-03 16:38:19

标签: sql-server

我尝试运行此SQL Server查询:

USE DB_UBB;

CREATE TABLE dept_emp (
    emp_no      INT         NOT NULL,
    dept_no     CHAR(4)     NOT NULL,
    from_date   DATE        NOT NULL,
    to_date     DATE        NOT NULL,
    FOREIGN KEY (emp_no) REFERENCES employees(emp_no) ON DELETE CASCADE, -- Error here
    FOREIGN KEY (dept_no) REFERENCES departments(dept_no) ON DELETE CASCADE, -- And here
    PRIMARY KEY (emp_no, dept_no)
);
CREATE INDEX (emp_no);
CREATE INDEX (dept_no);

我收到了这些错误:

Foreign key 'FK__dept_emp__8bc6840bee39d6cef4bd' references invalid table 'employees'.

Foreign key 'fk__dept_emp__99bc0b2304d3f32059a9' references invalid table 'departments'.

即使我有这些表格:

Departments

Employees

我做错了什么?

编辑:

添加了整个数据库:

enter image description here

3 个答案:

答案 0 :(得分:2)

SQL'隐藏'Clustered索引中Nonclustered索引的键中的列。 您已在emp_no,dept_no

上创建了复合主数据

primary的集群索引将在以下查询中隐藏索引的两列,并将生成错误

CREATE INDEX (emp_no);
CREATE INDEX (dept_no);

答案 1 :(得分:0)

如果要在列规范之后指定外键,请尝试使用CONSTRAINT子句:

to_date     DATE      NOT NULL,
CONSTRAINT fk_dept_emp_dept FOREIGN KEY (emp_no) REFERENCES employees(emp_no) ON DELETE CASCADE,
CONSTRAINT fk_dept_emp_emp FOREIGN KEY (dept_no) REFERENCES departments(dept_no) ON DELETE CASCADE,

答案 2 :(得分:0)

显然,我即使创建了表格,也没有认出它们。

我添加了<if not exist, create tables>

我还删除了CREATE INDEX (emp_no);CREATE INDEX (dept_no);,因为@Muhammad Nasir说,但它没有解决引用问题。

解决方案:

USE DB_UBB;

IF NOT EXISTS (SELECT * FROM SYSOBJECTS WHERE name='employees' and xtype='U')
    CREATE TABLE employees (
        emp_no      INT             NOT NULL,
        birth_date  DATE            NOT NULL,
        first_name  VARCHAR(14)     NOT NULL,
        last_name   VARCHAR(16)     NOT NULL,
        gender      VARCHAR(1)      NOT NULL CHECK (gender IN('M', 'F')),
        hire_date   DATE            NOT NULL,
        PRIMARY KEY (emp_no)
    );
GO

IF NOT EXISTS (SELECT * FROM SYSOBJECTS WHERE name='departments' and xtype='U')
    CREATE TABLE departments (
        dept_no     CHAR(4)         NOT NULL,
        dept_name   VARCHAR(40)     NOT NULL,
        PRIMARY KEY (dept_no),
        UNIQUE (dept_name)
    );
GO

IF NOT EXISTS (SELECT * FROM SYSOBJECTS WHERE name='dept_emp' and xtype='U')
CREATE TABLE dept_emp (
    emp_no      INT         NOT NULL,
    dept_no     CHAR(4)     NOT NULL,
    from_date   DATE        NOT NULL,
    to_date     DATE        NOT NULL,
    FOREIGN KEY (emp_no) REFERENCES employees(emp_no) ON DELETE CASCADE,
    FOREIGN KEY (dept_no) REFERENCES departments(dept_no) ON DELETE CASCADE,
    PRIMARY KEY (emp_no, dept_no)
);
GO