Mysql 一个表可以有多个主键吗?
我现在很困惑,也许你可以帮助我更好地理解这个问题,关于一个表可以有两个主键的问题,如果是,那么如何?如果没有,为什么?没有一个表中不能有两个主键,但可以有复合主键Mysql 一个表可以有多个主键吗?,mysql,sql,sql-server,database,sql-server-2008,Mysql,Sql,Sql Server,Database,Sql Server 2008,我现在很困惑,也许你可以帮助我更好地理解这个问题,关于一个表可以有两个主键的问题,如果是,那么如何?如果没有,为什么?没有一个表中不能有两个主键,但可以有复合主键 因为主键是行的标识,一行不能有两个ID。您只能有一个主键-所有可能是主键的键的范围可以称为候选键。您选择的一个是主键,其他可选键可以作为唯一约束/索引实现 因此,虽然只有1个主键,但您仍然可以使用唯一约束/索引确保其他字段/字段组合的优先级。否。表中不能使用超过1个主键。因此,您有多个字段组合的复合键。在表上,您可以创建索引,它允许内
因为主键是行的标识,一行不能有两个ID。您只能有一个主键-所有可能是主键的键的范围可以称为候选键。您选择的一个是主键,其他可选键可以作为唯一约束/索引实现
因此,虽然只有1个主键,但您仍然可以使用唯一约束/索引确保其他字段/字段组合的优先级。否。表中不能使用超过1个主键。因此,您有多个字段组合的复合键。在表上,您可以创建索引,它允许内部数据库引擎处理受影响列(1到多个)的内容,以便于查找。因为引擎此时已经在评估和排序字段的内容,所以它还可以轻松确保值的唯一性。因此,索引可以跨越1到多行,也可以是唯一的 主键在理论上是可选的,但在实践中是强制性的,它是引用表中特定行的永久唯一方式。它通常是GUID或自动递增整数(
identity
在SQL Server中)。主键本身对于任何给定的表都是唯一的,并且根据定义强制执行唯一约束,但可以选择跨多行(跨索引/键)
例如,您可以有一个只包含两个字段的连接表,这两个字段都是外键,共同构成表的主键/索引。因为您不能定义多个列作为主键,如下所示
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)
)
您询问是否可以有多个主键字段,并且您肯定可以。您只能有一个主键,但可以包含唯一标识行所需的任意多个列 在创建表时,请使用以下方法:
CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
其中p_Td
和LastName
是表中的列
如果你认为你想要不止一个主键,那么答案是“不是真的”。你只能有一个主键。但是,您可以拥有任意数量的索引,这些索引具有唯一的约束。唯一索引的作用与主键几乎相同
例如:-
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\u PersonID
)。但是,pk_PersonID
的值由两列组成(P_Id
和LastName
)。一个表可以有多个键,但按照惯例,每个表只有一个键被指定为“主”键。通常,这可能是被视为该表中信息的“首选”标识符的键,也可能是由表的设计者为某些其他特定目的而挑选出来的键
原则上,与指定为“primary”的键关联的任何函数或属性也可以与任何其他键关联。因此,出于许多实际目的,如果您愿意,您可以指定多个这样的“主键”——但前提是任何特定DBMS的限制允许 在数据的关系模型下,所有键都是相等的,主键没有特殊的功能(事实上,术语主键的关系用法最初指的是关系的任何键和所有键,而不仅仅是一个键)。不幸的是,许多DBMS不遵守这一原则,可能会将某些特性限制为表中的一个键,并且仅限于一个键,因此有必要选择将哪个键指定为主键。所以你的问题的答案原则上应该是肯定的。当您需要在某些特定的SQL DBMS中实现它时,实际的答案是:这取决于。创建表跟踪( col1数字(10)、col2数字(10)、col3数字(10)、col4数字(10), 主键(col1、col2、col3))否。该表只有on主键。但主键可以包含多个字段。这意味着当您创建表和提到主键时,可以添加多个要添加的列。 比如说 创建表名(col1数据类型、col2数据类型、col3数据类型、col4数据类型、主键(col1、col2、col3))
通过这种方式,您可以在单个表中添加主键。您可以尝试外键是一个表中引用另一个表中主键的字段(或字段集合)。为什么?。AFAIK主键有助于以内部方式唯一标识行。为什么会有很多这样的内部结构?。根据不同的字段,您可以有许多索引或键,但想法仍然是:它应该是唯一的标识符。您遇到的实际问题是什么?read..的可能重复。换句话说,这是否意味着P_Id和LastName都是可以用于将行标识为唯一的列?答案可能重复