''' 创建表员工 ( employeeID INT(10)主键, 名字CHAR(20) ); '''
''' 创建表工资 ( employeeID INT(10)主键, 薪水INT(10) ); ''' 是否可以在两个表中使用相同的主键?
答案 0 :(得分:2)
如果您的问题是是否可以在多个表中使用与主ID相同的EMPLOYEEID列,则答案为“是,您可以”
您可以在多个表上使用与主索引相同的列,但一个表上不能有多个主索引
答案 1 :(得分:0)
从技术上讲,这是可能的。 但是,建议使用外键。这将:
-避免冗余
-帮助维护数据库结构
-提高可读性
在此示例中,使用:
CREATE TABLE Employee ( EmployeeID INT PRIMARY KEY, Name CHAR (20), Primary Key (EmployeeId) );
CREATE TABLE SALARY ( SalaryId INT , EmployeeID INT , Salary INT (10), Primary Key (SalaryId), Foreign Key (EmployeeId) REFERENCES Employee );
*一种更好的方法是添加一个约束,而不仅仅是提及
[键名] 喜欢:
CREATE TABLE Employee(
EmployeeId INT,
Name CHAR(20)
)
ALTER TABLE Employee ADD CONSTRAINT PK_EmployeeId PRIMARY KEY
答案 2 :(得分:0)
是的。您可以在多个表中使用与主键相同的列名。
列名在表中应该是唯一的。一个表只能定义一个Entity integrity。它只能有一个主键。
如果此问题与数据建模父子关系有关,则有两种类型。您已在此阅读more。
答案 3 :(得分:0)
您可以执行此操作,但是,这是错误的设计。
我建议在Employee表上将EmployeeId作为PK,在Salary表上将EmployeeId作为外键,并且Salary表具有它自己的PK(很可能是SalaryId)。
我个人也不想使用[Name]字段,因为“ Name”是SQL中的保留字。
CREATE TABLE dbo.Employee
(
EmployeeId BIGINT IDENTITY(1,1)
,EmployeeName VARCHAR(20) NOT NULL
,CONSTRAINT PK_Emp PRIMARY KEY (EmployeeId)
);
GO
CREATE TABLE dbo.Salary
(
SalaryId BIGINT IDENTITY(1,1)
,EmployeeId BIGINT NOT NULL
,Salary INT NOT NULL
,CONSTRAINT PK_Sal PRIMARY KEY (SalaryId)
,CONSTRAINT FK_EmpSal FOREIGN KEY (EmployeeId)
REFERENCES Employee(EmployeeId)
);
GO
所有这些都说明了,我认为对db结构的思考要多一些,您最有可能最终得到3个表。可能很多员工的薪水是相同的,比如说5名员工的年薪为40,000,而3名员工的年薪为50,000,依此类推。 您最终将多次存储相同的薪水值。
更好的方法是一次存储该值,并使用第三张表将员工与薪水联系起来(在这种情况下,我将其称为[Earnings])。 通过这种结构,例如40,000的薪水在数据库中存储了1次,您可以多次将employeeId链接到它。
CREATE TABLE dbo.Employee
(
Id BIGINT IDENTITY(1,1)
,EmployeeName VARCHAR(20) NOT NULL
,CONSTRAINT PK_Emp PRIMARY KEY (Id)
);
GO
CREATE TABLE dbo.Salary
(
Id BIGINT IDENTITY(1,1)
,Salary INT NOT NULL
,CONSTRAINT PK_Sal PRIMARY KEY (Id)
);
GO
CREATE TABLE dbo.Earnings
(
Id BIGINT IDENTITY(1,1)
,EmployeeId BIGINT NOT NULL
,SalaryId BIGINT NOT NULL
,CONSTRAINT PK_Ear PRIMARY KEY (Id)
,CONSTRAINT FK_EmpEar FOREIGN KEY (EmployeeId)
REFERENCES Employee(Id)
,CONSTRAINT FK_SalEar FOREIGN KEY (SalaryId)
REFERENCES Salary(Id)
);
GO
答案 4 :(得分:0)
是的,可以。您将使salary.employeeid
既是表的主键又是雇员表的外键:
CREATE TABLE salary
(
employeeid INT (10) NOT NULL,
salary INT (10) NOT NULL,
CONSTRAINT pk_salary PRIMARY KEY (employeeid,
CONSTRAINT fk_salary_employeeid FOREIGN KEY (employeeid) REFERENCES employee (employeeid)
);
这将在表之间创建{1}:{0,1}关系,并确保您不能在没有存储员工的情况下存储薪水,并且不能为一个员工存储多个薪水。
这是我们很少做的事情。 (我们宁愿将薪水作为employee表中的一列。)我看到的另一个薪水表的唯一好处是,您可以授予对employee表的权利,但撤销其对薪水表的权利,从而使薪水表成为对某些数据库用户不可见。