一张表可以有多个主键吗?

30

我现在非常困惑,也许你能帮助我更好地理解问题,关于这个问题:一个表是否可以有两个主键?如果是,那么如何实现?如果不行,为什么?


2
为什么会这样?据我所知,主键有助于以内部方式唯一标识行。为什么要有多个这些内部呢?您可以有许多索引或具有多个字段的键,但是,基本原则仍然是:它应该是唯一标识符。 - The Marlboro Man
2
你遇到的实际问题是什么? - Popnoodles
阅读此教程 - Sohail
可能是在单个表中可以有多个主键吗?的重复问题。 - philipxy
10个回答

48

你问是否可以有多个主键字段,肯定可以。你只能有一个主键,但是它可以由尽可能多的列组成,以便唯一地标识行。

在创建表时可以使用类似以下语句:

CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName) 

其中P_TdLastName是您表中的列。

如果您认为需要多个主键,那么答案是“实际上不行”。您只能有一个主键。但是,您可以有任意数量的索引,对它们进行唯一约束条件。唯一索引与主键基本上具有相同的功能。

例如:-

CREATE TABLE Persons
(
   P_Id int NOT NULL,
   LastName varchar(255) NOT NULL,
   FirstName varchar(255),
   Address varchar(255),
   City varchar(255),
   CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
)

注意: 在上面的例子中只有一个主键 (pk_PersonID)。然而,pk_PersonID 的值由两列 (P_IdLastName) 组成。


换句话说,这是否意味着 P_Id 和 LastName 这两列都可以用来唯一标识一行数据? - Nikos

18

不行,你不能在一个表中有两个主键,但是你可以有一个复合主键。

因为主键是一行的标识,一行不能有两个ID。


6
一个表可以有很多键,但是按照惯例,每个表只会指定一个键作为“主”键。通常情况下,这个键被认为是该表中信息的“首选”标识符,或者是由表的设计者针对某些特定目的而选择的键。
原则上,你将与指定为“主”键的键相关联的任何功能或属性也可以与任何其他键相关联。因此,出于许多实际目的,如果任何特定DBMS的限制允许,您可以指定多个这样的“主”键,但是需要注意的是,不是所有DBMS都允许这么做。
在数据关系模型下,所有键都是相等的,并且没有给“主”键赋予特殊功能(事实上,关系术语“主键”的用法最初是指关系的任何和所有键而不仅仅是一个键)。不幸的是,许多DBMS不尊重这个原则,可能将某些特定功能限制为表格的一个且仅一个键,这使得必须非常谨慎地选择哪个键被指定为主键。因此,原则上,您的问题的答案应该是肯定的。当您需要在某个特定的SQL DBMS中实现它时,实际答案是:要看情况而定。

4

表格只有一个主键,但该主键可以包含多个字段。这意味着在创建表时,当您指定主键时,可以添加更多的列。

例如:

CREATE TABLE table_name ( col1 Datatype , col2 Datatype,col3 Datatype, col4 Datatype, PRIMARY KEY (col1,col2,col3) )

通过这种方式,您可以将主键添加到单个表中。


3
你只能有一个主键 - 可能成为主键的一系列键可以称为候选键。 你选择的那个是主键,其他备选键可以作为唯一约束/索引实现。
因此,虽然只有一个主键,但仍然可以使用唯一约束/索引来确保其他字段/字段组合的主键性。

1
由于您无法将多个列定义为主键,如下所示:
create table test1 (col1 numeric(10) primary key, col2 numeric(10) primary key 
,col3 numeric(10) primary key, col4 numeric(10)) 

它需要是一个复合键。是的,我们可以将多个列作为主键来解决一些业务需求。主键确保表中的列不会有重复值或空值。

以下是创建具有复合主键的表的SQL语句

CREATE TABLE track( 
col1 numeric(10) , col2 numeric(10) ,col3 numeric(10), col4 numeric(10), 
PRIMARY KEY (col1,col2,col3) 
)

1

创建表track( col1 numeric(10) , col2 numeric(10) ,col3 numeric(10) , col4 numeric(10), PRIMARY KEY (col1,col2,col3) )


可能是重复答案 - Chandy Kunhu

1
在表格中,您可以创建索引,这些索引允许内部数据库引擎处理受影响的列(1到多个)的内容,以便进行轻松查找。因为在那一点上引擎已经在评估和排序字段的内容,所以它也可以轻松确保值的唯一性。因此,一个索引可以跨越1到多行,并且还可以是唯一的。
主键是对特定索引的理论上可选但实际上强制的标记,它是引用表中特定行的永久唯一方式。它通常是GUID或自增整数(在SQL Server中是identity)。主键本身对于任何给定的表都是唯一的,并通过定义强制执行唯一约束,但是也可以跨越多行(跨度索引/键)。
例如,您可以有一个包含仅两个字段的连接表,这两个字段都是外键,并共同形成表的主键/索引。

1
您可以尝试使用FOREIGN KEY,它是一个字段(或字段集合),在一个表中引用另一个表中的PRIMARY KEY。

0

不可以。在表中你不能使用超过一个主键,但你可以使用复合键,它是多个字段的组合。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接