【问题标题】:What is the difference b/w Primary Key and Unique Key黑白主键和唯一键有什么区别
【发布时间】:2023-03-12 20:55:01
【问题描述】:

我试图在谷歌中找到它,但那里给出的答案并不令人满意。任何人都可以解释坚实的区别。

实际上,如果主键用于唯一选择数据,那么唯一键需要什么?

什么时候应该使用主键,什么时候应该使用唯一键?

【问题讨论】:

  • 读者应该注意,在 SQL PK 中意味着某些东西——一组有区别的非空 UNIQUE 的 NOT NULL 列——不同于关系模型中的——一个有区别的可能为空的唯一集合(非null,如果您认为它们是允许的)列不包含较小的列。

标签: primary-key unique-key


【解决方案1】:

主键和唯一键用于不同的事情 - 了解它们的用途将帮助您决定何时使用它们。

主键用于标识表中的一行数据。每当您需要引用特定行时使用它,例如。在其他表中或通过应用程序代码等。为了识别行,PK 的值必须是唯一的。此外,它们不能为 null,因为大多数 DBMS 将 null 视为不等于 null(因为 null 通常表示“未知”)。一张桌子只能有一个PK。数据库中的所有表都应该有一个 PK(尽管大多数 DBMS 不强制执行此操作),并且 PK 可以跨越多个列。

唯一键约束用于确保数据不会在数据库中的两行中重复。允许数据库中的一行对于唯一键约束的值具有空值。虽然一个表应该有一个 PK,但它不需要有任何额外的唯一键。但是,如果满足您的需要,表可以具有多个唯一键。与 PK 一样,唯一键可以跨越多个列。

还值得知道的是,默认情况下,许多 DBMS 索引和物理上使用 PK 对磁盘上的表进行排序。这意味着通过 PK 查找值比连续使用其他值更快。但是,通常情况下,您可以根据需要覆盖此行为。

【讨论】:

  • PK can span multiple columns. 是什么意思?
  • 在许多示例中,您会看到主键是表中的单个列;通常是唯一标识行的整数 ID 号(这称为标识列)。这很好(而且通常很方便),但 PK不必 是单列。
  • 例如,您可以有一个产品表。假设每种产品都有多种型号和多种颜色,因此 Products 表有一个 ModelNum 列和一个 Color 列。现在,ModelNum 和 Color 列都不能唯一标识一个产品,但它们一起可以。在这种情况下,您可以定义一个包含 ModelNum 和 Color 列的主键(这称为“复合主键”)。当然,恒等列 PK 与复合列 PK 方法各有利弊……但这是另一个问题。
【解决方案2】:

术语“唯一键”既模棱两可又重复。在关系模型中,“键”表示候选键,根据定义,它无论如何都是唯一的。主键只是关系的任何一个候选键。因此,“唯一键”的含义与“候选键”的含义完全相同,“候选键”的含义与“主键”的含义完全相同。没有区别。

但是,SQL 有一个称为 UNIQUE 约束的东西,它与 SQL PRIMARY KEY 约束略有不同——两者都强制唯一性,但 PRIMARY KEY 只能在每个表中使用一次。 UNIQUE 约束也允许空值,而 PRIMARY KEY 约束则不允许。

因此,可能令人困惑的术语“唯一键”最常用于表示由唯一约束强制执行的键。它甚至可以用来表示对可空列的唯一约束,尽管在我看来这是一个非常可疑的术语,因为一组包含空值的列不能作为候选键,所以使用“键”这个词来表示可空列并不真正正确,必然会引起混乱。

【讨论】:

  • “唯一键”的含义与“候选键”完全相同,与“主键”的含义完全相同。没有区别。” - 这是不正确的,正如您在其余答案中所说的那样
  • 我在这里解释的是,不幸的是,“唯一键”这个词偶尔会被误用来描述非唯一且不是键的东西。我认为应该很明显,这是对这两个词的误用,并且“唯一键”一词的唯一正确含义是描述独特且是键的事物。因此“唯一键”的准确含义与主键和候选键相同。
【解决方案3】:

在讨论Primary Key和Unique Key之间的区别之前,重要的是要确定什么是key,它在业务中的作用以及在SQL / Oracle等中的实现方式。

根据业务前景: 对于一个组织或企业来说,有如此多的物理实体(如人、资源、机器等)和虚拟实体(它们的任务、事务、活动)。 通常,业务需要为这些业务实体记录和处理信息。 这些业务实体在整个业务领域内由一个 Key 标识。

根据 RDBMS 的预期: Key(a.k.a Candidate Key),唯一标识实体的一个值或一组值。对于 Db-Table,存在很多键并且可能符合主键的条件。 这样所有的key、primary key、unique key等统称为Candidate Key。

对于一个表 DBA 选择的候选键称为主键,其他候选键称为辅助键。

主键和唯一键的区别

1.行为:主键用于标识表中的行(记录),而唯一键用于防止列中的重复值。

2。索引: 默认情况下,如果主键不存在,Sql-engine 会在主键上创建聚集索引,在唯一键上创建非聚集索引。

3.可空性:主键不包括空值,而唯一键可以。

4.存在性:一张表最多可以有一个主键,但可以有多个唯一键。

5.可修改性:您不能更改或删除主值,但唯一键值可以。

有关示例的更多信息: http://dotnetauthorities.blogspot.in/2013/11/Microsoft-SQL-Server-Training-Online-Learning-Classes-Integrity-Constraints-PrimaryKey-Unique-Key_27.html

【讨论】:

  • "默认情况下 Sql-engine 在主键上创建聚集索引" 取决于所使用的 DBMS。并非所有 DBMS 都具有“聚集索引”之类的东西,并且并非所有数据库都默认使用它们。
【解决方案4】:

主键是唯一键。两种类型的键都用于唯一标识表中的单行。由于几个不同的实现原因,许多 RDBMS 要求将表上的唯一键之一指定为“主键”。在数据完整性方面,没有区别。

【讨论】:

    【解决方案5】:

    主键不允许空值,唯一键将允许一个空值(在 sql server 和 Oracle 上的多个空值) 一张表只能有一个主键,但可以有多个唯一键

    当你想建立外键关系时使用主键

    这是一个小例子,每个表只有一列

    --primary key table
    CREATE TABLE PrimaryTest (id INT PRIMARY KEY NOT NULL)
    GO
    
    -- foreign key table
    CREATE TABLE ForeignTest (Pkid INT NOT NULL)
    GO
    
    
    --relationship
    ALTER TABLE dbo.ForeignTest ADD CONSTRAINT
        FK_ForeignTest_PrimaryTest FOREIGN KEY
        (
        Pkid
        ) REFERENCES dbo.PrimaryTest
        (
        id
        ) ON UPDATE  NO ACTION 
         ON DELETE  NO ACTION 
    
    GO
    

    在主键表中插入一行

    insert PrimaryTest values(1)
    

    在外键表中插入一行,其值存在于主键表中

    insert ForeignTest values(1)
    

    现在这将失败,因为主键表中不存在值 2

    insert ForeignTest values(2)
    

    消息 547,第 16 级,状态 0,第 1 行 INSERT 语句与 FOREIGN KEY 约束“FK_ForeignTest_PrimaryTest”冲突。冲突发生在数据库“aspnetdb”、表“dbo.PrimaryTest”、列“id”中。 声明已终止。

    【讨论】:

    • 你能举个小例子我如何使用唯一键来建立外键关系
    • 这个例子是关于外键的,我问的是唯一键。
    • 声明“一个唯一的密钥将允许一个空值”取决于所使用的 DBMS。有些允许多个空值(Postgres、MySQL、Firebird),有些不允许(Oracle、DB2、SQL Server)
    • 没有键允许空值。如果一列允许空值,那么它肯定不是键或键的任何部分。 SQL UNIQUE 不一定是键。在 SQL 中,可为空的 UNIQUE 约束可能根本不是“唯一的”。
    【解决方案6】:

    再补充一个例子:

    想象一个保存用户数据的表格,其中每个用户都有一个电子邮件地址。没有两个用户可以拥有相同的电子邮件地址,因此该列成为唯一键。虽然它可以是主键(我从未将字符串设为主键),但不一定非要如此。

    【讨论】:

    • 感谢您提供用户表的示例。我一直在寻找这个确切的答案。举例说明更容易想象和理解。
    【解决方案7】:

    两者都代表表中一行的唯一标识,但有一点区别是

    PRIMARY 键不允许 NULL 值

    同时

    UNIQUE 键只允许一个 NULL 值。

    这是主要区别..

    【讨论】:

    • 声明“UNIQUE 键只允许一个 NULL 值”取决于所使用的 DBMS。有些允许多个空值(Postgres、MySQL、Firebird),有些不允许(Oracle、DB2、SQL Server)
    【解决方案8】:

    主键约束
    1.主键不能为null。
    2. 不允许有多个主键。
    3. 在某些 RDBMS 上,主键默认生成聚集索引。

    唯一约束
    1. 可以在允许空值的列上定义唯一约束。
    2. 允许多个唯一键。
    3. 在某些 RDBMS 上,唯一键默认生成非聚集索引。

    来源维基百科

    【讨论】:

      【解决方案9】:

      NOT NULL 表示该特定列中的任何条目都不应为空。 UNIQUE 表示列中的每个条目都应该是不同的。 PRIMARY KEY 表示列中的任何条目都应该是不同的,而不是 null。

      这么简单..

        PRIMARY KEY= UNIQUE + NOT NULL
      

      【讨论】:

        【解决方案10】:

        每个表可以有许多 UNIQUE 约束,但每个表只能有一个 PRIMARY KEY 约束。更多信息可以找到here

        【讨论】:

          【解决方案11】:

          唯一键将与其他键一起使用,而主键不与任何其他键一起使用。 使用主键时没有任何其他键的关联。

          【讨论】:

          • 你能解释清楚一点吗?你说的“配菜”到底是什么意思?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-22
          • 2011-09-16
          • 2013-12-22
          • 2011-04-06
          • 2012-09-30
          • 1970-01-01
          相关资源
          最近更新 更多