表可以有多个主键吗?

时间:2013-12-23 11:49:01

标签: mysql sql sql-server database sql-server-2008

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

10 个答案:

答案 0 :(得分:28)

您询问是否可以拥有多个主键字段,而且您肯定可以。您只能拥有一个主键,但可以包含唯一标识行所需的列数。

在创建表格时使用类似的内容:

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)
)

注意:在上面的示例中,只有一个PRIMARY KEY(pk_PersonID)。但是,pk_PersonID的值由两列(P_IdLastName)组成。

答案 1 :(得分:14)

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

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

答案 2 :(得分:4)

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

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

在数据的关系模型下,所有键都相等,并且没有给主键提供特殊功能(事实上,术语主键的关系用法最初是指 any 关系的所有键,而不仅仅是一个键)。遗憾的是,许多DBMS不遵守这一原则,并且可能将某些特征限制为表中的一个且仅一个键,因此必须选择将哪个键指定为主键。所以你的问题的答案原则上应该是肯定的。当你需要在某个特定的SQL DBMS中实现它时,实际的答案是:它取决于它。

答案 3 :(得分:3)

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

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

答案 4 :(得分:3)

不。表只有主键。但是该主键可以包含多个字段。表示创建表时以及提及主键时,可以添加多个所需的列。 例如

CREATE TABLE table_name(col1数据类型,col2数据类型,col3数据类型,col4数据类型,PRIMARY KEY(col1,col2,col3))

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

答案 5 :(得分:1)

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

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

例如,您可以使用仅包含2个字段的联结表,这两个字段都是外键,并且一起构成表的主键/索引。

答案 6 :(得分:0)

不可以。你不能在表中使用多个主键。因为你有复合键,它是多个字段的组合。

答案 7 :(得分:0)

由于您无法将多个列定义为主键,如下所示

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

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

以下是使用Composite Primary Key创建表的SQL

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

答案 8 :(得分:0)

CREATE TABLE曲目( col1数字(10),col2数字(10),col3数字(10),col4数字(10), 主键(col1,col2,col3) )

答案 9 :(得分:0)

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