首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以在两个不同的表中使用相同的主键吗?

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

Stack Overflow用户
提问于 2019-04-11 19:39:23
回答 5查看 8.7K关注 0票数 1

‘创建表Employee ( employeeID INT (10)主键,姓名CHAR (20) );’

‘CREATE TABLE Salary ( employeeID INT (10) primary KEY,SALARY INT (10) );’是否可以在两个表中使用相同的主键?

EN

回答 5

Stack Overflow用户

发布于 2019-04-11 19:48:16

如果您的问题是您是否可以在多个表上使用相同的EMPLOYEEID列作为主ID,那么答案是“可以”

您可以在多个表上使用同一列作为主索引,但一个表上不能有多个主索引

票数 2
EN

Stack Overflow用户

发布于 2019-04-11 19:57:01

你可以做到这一点,但是,这是糟糕的设计。

我建议在employee表上使用EmployeeId作为PK,在Salary表上使用EmployeeId作为外键,并且Salary表有自己的PK (最有可能是SalaryId)。

另外,我个人也会避免使用字段名,因为" Name“在SQL中是一个保留字。

代码语言:javascript
复制
    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,以此类推。你最终会多次存储相同的工资值。

一种更好的方法是将该值存储一次,然后创建第三个表,将员工与工资(在本例中,我将其称为收入)链接起来。在这种结构中,比如说40,000的薪水在数据库中存储了一次,并且您可以多次将employeeId链接到它。

代码语言:javascript
复制
    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
票数 2
EN

Stack Overflow用户

发布于 2019-04-11 19:52:57

是。多个表中的主键可以具有相同的列名。

表中的列名应该是唯一的。一个表只能有一个主键,因为它定义了Entity integrity

如果这个问题是关于数据建模的父子关系,那么有两种类型。你在这上面读到了more

  1. Identifying relationship:子节点在父节点的帮助下确定自己的身份。在这里,Employee和Salary将共享相同的主键。父表的主键(EmployeeId)将是子表的主键,也是子表的关系:子表有自己的身份。这里,Employee和Salary将有不同的主键。子表将有自己的主键(比如SalaryId),并将父表的主键作为外部key(EmployeeId).
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55631622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档