主键和唯一约束之间有什么区别?

时间:2009-08-20 20:22:34

标签: sql primary-key

有人在接受采访时问我这个问题......

16 个答案:

答案 0 :(得分:53)

主键不能为空。唯一键可以。

答案 1 :(得分:23)

主键表上的唯一字段,但在表将该行视为其键的意义上它是特殊的。这意味着其他表可以使用此字段为自己创建外键关系。

唯一约束仅表示特定字段必须是唯一的。

答案 2 :(得分:12)

  1. 主键不能为null,但唯一只能有一个空值。
  2. 主键自动创建群集索引,但不创建唯一键。
  3. 一个表只能有一个主键,但唯一键不止一个。

答案 3 :(得分:5)

TL; DR很多可以由PRIMARY KEY隐含(唯一性,可引用,非零,聚类等),但不能使用UNIQUE明确说明。< / p>

我建议如果你是那种喜欢SELECT * FROM...方便的编码员,而不必列出所有那些讨厌的专栏,那么PRIMARY KEY就是适合你的。


  

relvar可以有多个键,但我们只选择一个用于下划线   并将其称为主键。选择是任意的,所以   从逻辑上讲,初级概念并不是非常重要   观点。然而,关键的一般概念非常重要!该   术语候选键意味着与键完全相同(即,添加   候选人没有真正的意义 - 这是特德·科德提出的   因为他认为每把钥匙都被提名为候选人   主键)... SQL允许表的列的子集   声明为该表的键。它也允许其中一个   被提名为主要钥匙。指定要成为主要的密钥   与其他人相关的一定的便利性   可能需要的约束

What Is a Key? by Hugh Darwen


  

通常......将一个密钥单独输出作为主密钥(以及任何其他密钥)   然后将所讨论的relvar的密钥称为备用密钥。   但是否有一些关键是被选为主要关键,如果是,那么哪一个,   本质上是心理问题,超出了范围   关系模型本身。作为一个良好的实践,大多数基地   relvars可能应该有一个主键 - 但重复一下,这个规则,   如果这是一个规则,那真的不是一个关系问题......强   建议[对SQL用户]:对于基表,无论如何,请使用   PRIMARY KEY和/或UNIQUE规范,以确保每一个   表确实至少有一个密钥。

SQL and Relational Theory: How to Write Accurate SQL Code 由C. J. Date

在标准SQL PRIMARY KEY

  • 表示唯一性,但您可以明确指定(使用UNIQUE)。
  • 暗示NOT NULL,但您可以在创建列时明确指定(但无论如何都应该避免使用空值!)
  • 允许您在FOREIGN KEY中省略其列,但您可以明确指定它们。
  • 每个表只能声明一个键,但不清楚为什么(Codd,最初提出这个概念,没有施加这样的限制)。

在某些产品中,PRIMARY KEY表示表的聚簇索引,但您可以明确指定(您可能不希望主键成为聚簇索引!)

对于某些人PRIMARY KEY具有纯粹的心理意义:

  • 他们认为这意味着密钥将在外键中引用(这是由Codd提出的,但实际上并未被标准SQL和SQL供应商采用)。
  • 他们认为它表示该表的唯一关键(但是未能强制执行其他候选密钥会导致数据完整性丢失)。
  • 他们认为这意味着“代理”或“人工”密钥对业务没有任何意义(但实际上通过向用户公开对企业施加了不必要的重要性)。

答案 4 :(得分:4)

每个主键都是唯一约束,但除了PK之外,表还可以有其他唯一约束。

假设您有一个表Employees,PK EmployeeID。例如,您可以在SSN上添加唯一约束。

答案 5 :(得分:4)

唯一键约束:

  1. 唯一键约束将为您提供类似列值应保持唯一性的约束。
  2. 默认情况下会创建非聚集索引
  3. 可以在表格中添加任意数量的唯一约束。
  4. 它将允许列中的空值。

    ALTER TABLE table_name 添加约束UNIQUE_CONSTRAINT UNIQUE(column_name1,column_name2,...)

  5. 主键:

    1. 主键将在表格中创建列数据唯一性。
    2. 主键默认情况下会创建聚簇索引
    3. 只能为表格创建一个Primay密钥
    4. 可以合并多个列以形成单个主键
    5. 它不允许空值。

      ALTER TABLE table_name 添加约束KEY_CONSTRAINT PRIMARY KEY(column_name)

答案 6 :(得分:2)

除了安德鲁的答案之外,每个表只能有一个主键,但你可以有许多独特的约束。

答案 7 :(得分:2)

  1. 主键的目的是唯一标识表中的行。唯一约束确保字段的值在表中的行中是唯一的。
  2. 每个表只能有一个主键。每个表可以有多个唯一约束。

答案 8 :(得分:1)

主键是一组最小列,这些列中具有相同值的任何两个记录在所有列中具有相同的值。请注意,主键可以包含多个列。

唯一性约束正是它听起来的样子。

答案 9 :(得分:1)

UNIQUE约束唯一标识数据库表中的每条记录。

UNIQUE和PRIMARY KEY约束都为一列或一组列的唯一性提供了保证。

PRIMARY KEY约束自动在其上定义UNIQUE约束。

请注意,每个表可以有多个UNIQUE约束,但每个表只有一个PRIMARY KEY约束

答案 10 :(得分:0)

主键不能为空,但唯一约束可以为空。 当您为表选择主键时,它会自动索引该字段。

答案 11 :(得分:0)

主键基本上是(unique + not null)的组合。同样,当引用外键时,rdbms需要主键。

唯一键只是强加了列的唯一性。在uniqe键的情况下,字段的值可以为NULL。它也不能用于引用外键,这很明显,因为你可以在其中包含空值

答案 12 :(得分:0)

到目前为止,这里有几个很好的答案。除了主键不能为空之外,它本身是一个唯一约束,并且可以由多个列组成,还有更深层的含义取决于您使用的数据库服务器。

我是SQL Server用户,因此主键对我来说具有更具体的含义。在SQL Server中,默认情况下,主键也是所谓的“聚簇索引”的一部分。聚簇索引定义该特定表的数据页的实际排序,这意味着主键排序与磁盘上行的物理顺序相匹配。

我知道MySql的表格格式中的一个,可能更多也支持聚簇索引,这意味着它与SQL Server中的相同......它定义了磁盘上的物理行排序。

Oracle提供了一种称为索引组织表的东西,它通过主键对磁盘上的行进行排序。

我对DB2不是很熟悉,但我认为聚簇索引意味着磁盘上的行以与单独索引相同的顺序存储。我不知道聚簇索引是否必须与主键匹配,或者它是否可以是一个不同的索引。

答案 13 :(得分:0)

两者都保证表中各行的唯一性,除了其他一些答案中提到的空值。

此外,主键“附带”一个索引,可以是群集的也可以是非群集的。

答案 14 :(得分:0)

这里有很多答案讨论了PK与唯一约束的属性。但了解概念上的差异更为重要。

主键被视为数据库中记录的标识符。因此,例如,在表之间创建外键引用时将引用这些引用。因此,在正常情况下,主键不应包含在您的域中具有任何重音的值(通常会使用自动增量字段)。

唯一约束只是在数据库架构中强制执行特定于域的业务规则的一种方法。

因为PK是记录的标识符,所以永远不能更改主键的值。

答案 15 :(得分:0)

create table a1 (id int,name varchar(20),city varchar(20),state varchar(20),country varchar(28) constraint pk_a1 primary key(id));
insert into a1 values(101,'sohan','gkp','up','india');


create table a1 (id int primary key,name varchar(20),city varchar(20),state varchar(20),country varchar(28));
insert into a1 values(101,'sohan','gkp','up','india');

使用主键和使用约束

这两个表之间的差异是什么