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

Posted

技术标签:

【中文标题】一个表可以有多个主键吗?【英文标题】:Can a table have multiple Primary keys? 【发布时间】:2014-01-11 15:15:10 【问题描述】:

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

【问题讨论】:

为什么会这样? AFAIK 主键有助于以内部方式唯一标识一行。为什么你会有很多这样的内部结构?您可以拥有多个索引或根据多个字段拥有键,但是,这个想法仍然存在:它应该是一个唯一标识符。 您遇到的实际问题是什么? 阅读this tutorial.. Can I have multiple primary keys in a single table?的可能重复 【参考方案1】:

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

【讨论】:

【参考方案2】:

不。该表只有一个主键。但是该主键可以包含多个字段。意味着当您创建表并提及主键时,您可以添加多个您想要的列。 例如

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

通过这种方式可以在单表中添加主键

【讨论】:

【参考方案3】:

创建表轨道( col1 数字(10),col2 数字(10),col3 数字(10),col4 数字(10), 主键 (col1,col2,col3) )

【讨论】:

可能重复的答案【参考方案4】:

你问你是否可以有多个主键字段,你肯定可以。您只能有一个主键,但它可以由您需要的任意多列组成,以唯一标识您的行。

在创建表格时使用类似的东西:

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 是可以同时用于将行标识为唯一的列?【参考方案5】:

一个表可以有许多键,但按照惯例,每个表只有一个键被指定为“主”键。通常,这可能是被认为是该表中信息的“首选”标识符的键,也可能是表设计者为某些其他特定目的而挑选出来的键。

原则上,您与指定为“主要”的键相关联的任何功能或属性也可以与任何其他键相关联。因此,出于许多实际目的,如果您愿意,您可以指定多个这样的“主”键 - 但前提是任何特定 DBMS 的限制允许。

在数据的关系模型下,所有的键都是相等的,没有赋予主键特殊的功能(实际上,术语主键的关系用法最初是指any em> 和 all 关系的键,而不仅仅是一个键)。不幸的是,许多 DBMS 不遵守这一原则,并且可能将某些功能限制为表的一个且只有一个键,因此有必要选择将哪个键指定为主键。所以原则上你的问题的答案应该是肯定的。当您需要在某些特定的 SQL DBMS 中实现它时,实际答案是:视情况而定。

【讨论】:

【参考方案6】:

因为您不能将多个列定义为主键,如下所示

create table test1 (col1 numeric(10) primary key, col2 numeric(10) primary key 
,col3 numeric(10) primary key, col4 numeric(10)) 

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

以下是使用复合主键创建表的 SQL

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

【讨论】:

【参考方案7】:

您可以在表上创建索引,这允许内部数据库引擎处理受影响列(1 到多个)的内容以便于查找。因为此时引擎已经在对字段的内容进行评估和排序,所以它也可以轻松地确保值的唯一性。因此,索引可以跨越 1 到多行,并且还可以选择是唯一的。

主键在理论上是可选的,但在实践中是强制性的,标记在特定索引上,它是引用表中特定行的永久唯一方式。它通常是 GUID 或自增整数(SQL Server 中的identity)。主键本身对于任何给定的表都是唯一的,并根据定义强制执行唯一约束,但可以选择跨越多行(跨度索引/键)。

例如,您可以有一个仅包含 2 个字段的联结表,这两个字段都是外键,共同构成表的主键/索引。

【讨论】:

【参考方案8】:

不。您不能在表中使用超过 1 个主键。因为您有复合键,它是多个字段的组合。

【讨论】:

【参考方案9】:

您只能有 1 个主键 - 可能都是主键的键范围可以称为候选键。您选择的是主键,其他替代键可以实现为唯一约束/索引。

因此,虽然只有 1 个主键,但您仍然可以使用唯一约束/索引来确保其他字段/字段组合的素数。

【讨论】:

【参考方案10】:

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

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

【讨论】:

以上是关于一个表可以有多个主键吗?的主要内容,如果未能解决你的问题,请参考以下文章

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

Oracle一个字段的的外键可以当另一个字段的主键吗

一个表只能有一个主键索引,一个主键索引可以多个字段

外键是唯一的吗?

数据库表可以没有主键吗?

每个表都应该有一个主键吗?