CREATE TABLE DEPARTMENTS
(Department_Id varchar(5) Primary Key NOT NULL,
Department_Name char(20) NOT NULL,
Manager_Id varchar(5) FOREIGN KEY REFRENCES EMPLOYEES,
Location_Id FOREIGN KEY REFRENCES LOCATIONS)
GO
CREATE TABLE EMPLOYEES
(Employee_Id varchar Primary Key NOT NULL,
First_Name char(20) NOT NULL,
Last_Name char(20) NOT NULL,
Email varchar(60) NULL,
PhoneNumber varchar(13) NULL,
Hire_Date date NOT NULL,
Manager_ID varchar(5) FOREIGN KEY REFRENCES EMPLOYEES
Department_IdFK REFRENCES DEPARTMENTS)
GO
CREATE TABLE LOCATIONS
(Location_ID varchar(5) Primary Key,
Postal_Code no(5),
City text(60),
State_Province text(20),
Country text(60))
答案 0 :(得分:4)
我会放下约束,但是你走了。
CREATE TABLE DEPARTMENTS (
Department_Id varchar(5) Primary Key,
Department_Name char(20) NOT NULL,
Manager_Id varchar(5),
Location_Id varchar(5)
)
GO
CREATE TABLE EMPLOYEES (
Employee_Id varchar(5) Primary Key,
First_Name char(20) NOT NULL,
Last_Name char(20) NOT NULL,
Email varchar(60) NULL,
PhoneNumber varchar(13) NULL,
Hire_Date date NOT NULL,
Manager_ID varchar(5),
Department_Id varchar(5)
)
GO
CREATE TABLE LOCATIONS (
Location_ID varchar(5) Primary Key,
Postal_Code varchar(5),
City varchar(60),
State_Province varchar(20),
Country varchar(60)
)
GO
ALTER TABLE DEPARTMENTS WITH CHECK ADD CONSTRAINT [FK_DepartmentManager] FOREIGN KEY([Manager_Id])
REFERENCES EMPLOYEES ([Employee_Id])
GO
ALTER TABLE DEPARTMENTS WITH CHECK ADD CONSTRAINT [FK_UserLocation] FOREIGN KEY([Location_Id])
REFERENCES LOCATIONS ([Location_Id])
GO
ALTER TABLE EMPLOYEES WITH CHECK ADD CONSTRAINT [FK_EmployeeManager] FOREIGN KEY([Manager_Id])
REFERENCES EMPLOYEES ([Employee_Id])
GO
ALTER TABLE EMPLOYEES WITH CHECK ADD CONSTRAINT [FK_EmployeeDepartment] FOREIGN KEY([Department_Id])
REFERENCES DEPARTMENTS ([Department_Id])
GO
答案 1 :(得分:2)
您多次将REFERENCES
拼错为REFRENCES
。尝试正确拼写,看看问题是否消失。
答案 2 :(得分:1)
DEPARTMENTS REFERENCES EMPLOYEES
EMPLOYEES REFERENCES EMPLOYEES
这使得这些表难以使用。看来你允许这些NULL
知道能够在两个表中创建两个实体,你需要两个INSERT
s加上两个UPDATE
。
此外,它似乎允许员工的经理与其部门经理不同 - 这是为了这个吗?
我会'设计'需要NULL
能够引用/引用列并创建另外两个关系表:
DepartmentalStaff REFERENCES Employees REFERENCES Departments
DepartmentalManagers REFERENCES DepartmentalStaff
答案 3 :(得分:0)
你没有提到它的目的是什么数据库,你有一些非常奇怪的数据类型......
虽然有些一般性评论(主要适用于SQL Server):
一般情况下,短字符串(10个字符以下)可以而且应该CHAR(x)
- 所以Department_Id
确实应该是char(5)
字段
CHAR(X)
字段(至少在SQL Server中)总是用空格填充到它们的全长 - 所以如果你有Department_Id CHAR(5)
并输入'ABC'
,那么列将会包含'ABC..'
因此,首字母和姓氏等栏目肯定不为CHAR(20)
- 如果您将'Bruce'放入first_name
,您最终会与'布鲁斯...............' - 祝你在这样一个专栏上找到任何东西!请改用VARCHAR(20)
!
如果您真的使用的是SQL Server 2005及更高版本,则应停止使用TEXT
- 该数据类型已被弃用。使用VARCHAR(MAX)
代替它 - 它具有TEXT的所有好处,而且你可以使用它上面的所有常用字符串函数。
我个人的建议也是使用INT
来处理Location_Id
之类的事情 - 通常,加入和搜索INT比VARCHAR(5)更快 - 加上INT,你永远不必担心拼写错误,错误的整理或大写/小写问题。如果您使用非描述性代理列作为您的ID,我认为这是一件好事,我会将其设为INT - 不要使用字符串作为ID - 它往往会变得混乱(除了字符串是在整个地方使用 - 比如州缩写等等)