Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 一个表可以有多个主键吗?_Mysql_Sql_Sql Server_Database_Sql Server 2008 - Fatal编程技术网

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都是可以用于将行标识为唯一的列?答案可能重复