我可以在两个不同的表中使用一个相同的主键吗?

时间:2019-04-11 11:39:23

标签: sql database primary-key

''' 创建表员工 ( employeeID INT(10)主键, 名字CHAR(20) ); '''

''' 创建表工资 ( employeeID INT(10)主键, 薪水INT(10) ); ''' 是否可以在两个表中使用相同的主键?

5 个答案:

答案 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

  1. 识别关系:孩子在父母的帮助下进行自我识别。在这里,“员工与薪水”将共享相同的主键。父表的主键(EmployeeId)也将是子表的主键(Salary)。
  2. 非身份关系:孩子有自己的身份。在这里,“员工和薪水”将具有不同的主键。子表将具有其自己的主键(例如SalaryId),并将父表的主键作为外键(EmployeeId)。

答案 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表的权利,但撤销其对薪水表的权利,从而使薪水表成为对某些数据库用户不可见。