【问题标题】:difference between primary key and unique key主键和唯一键的区别
【发布时间】:2012-03-22 21:16:27
【问题描述】:

我正在使用 mysql 数据库。我在主键和唯一键之间有混淆。

请帮助我应该在哪里创建主键和唯一键。我的意思是在哪种情况下我们创建唯一键或主键。

【问题讨论】:

标签: mysql sql database primary-key unique-key


【解决方案1】:

主键:

  • 一个表中只能有一个主键约束
  • 在某些 DBMS 中不能是 NULL - 例如MySQL 添加NOT NULL
  • 主键是记录的唯一键标识符

唯一密钥:

  • 一个表中可以有多个唯一键
  • 唯一键可以有NULL
  • 可以是候选键
  • 唯一键可以是NULL;多行可以有NULL 值,因此可能不被视为“唯一”

【讨论】:

  • 还想在多列上创建主键,例如主键(客户 ID、产品 ID)。这称为复合主键。这是为了澄清第一点,因为它可能被新来的 sql 采用(读取一个键 => 一个列):)
  • “可以成为候选键”是什么意思?
  • "only single null is allowed" - 这不是真的,至少对于 MySQL 来说是这样。
  • 唯一键可以为空,也可以不唯一意思 ??
  • @PratikCJoshi 他可能的意思是可以是多行,否则唯一键为空。
【解决方案2】:

主键和唯一键的区别

+-----------------------------------------+-----------------------------------------------+
|                Primary Key              |                    Unique Key                 |
+-----------------------------------------+-----------------------------------------------+
| Primary Key can't accept null values.   | Unique key can accept only one null value.    |
+-----------------------------------------+-----------------------------------------------+
| By default, Primary key is clustered    | By default, Unique key is a unique            |
| index and data in the database table is | non-clustered index.                          |
| physically organized in the sequence of |                                               |
| clustered index.                        |                                               |
+-----------------------------------------+-----------------------------------------------+
| We can have only one Primary key in a   | We can have more than one unique key in a     |
| table.                                  | table.                                        |
+-----------------------------------------+-----------------------------------------------+
| Primary key can be made foreign key     | In SQL Server, Unique key can be made foreign |
| into another table.                     | key into another table.                       |
+-----------------------------------------+-----------------------------------------------+

【讨论】:

    【解决方案3】:

    主键和唯一键的区别

    Primary keyUnique Key 都用于唯一定义表中的行。 Primary Key 创建列的 clustered index,而 Unique creates an unclustered index of the column

    A Primary Key 不允许NULL value,但a Unique Key 允许one NULL value

    【讨论】:

      【解决方案4】:

      主键的主要特征是:

      它必须包含每行数据的唯一值。 它不能包含空值。 一个表中只有一个主键。

      唯一键的主要特点是:

      它还可以包含每行数据的唯一值。

      它也可以包含空值。

      一个表中有多个唯一键。

      【讨论】:

        【解决方案5】:

        我知道这个问题已经有好几年了,但我想提供一个答案来解释为什么而不是如何

        主键的用途:唯一标识数据库中的一行 => 一行表示由表建模的实体类型的单个实例。主键强制实体的完整性,AKA 实体完整性。主键将是一个聚集索引,即它定义了数据物理存储在表中的顺序。

        唯一键的用途:好的,使用主键我们可以唯一标识一行。但我有一个业务需求,另一列/一组列应该具有唯一值。好吧,从技术上讲,鉴于此列是唯一的,它可以成为强制实体完整性的候选者。但据我们所知,此列可能包含来自外部组织的数据,我可能怀疑这些数据是否独一无二。我可能不相信它可以提供实体完整性。我只是让它成为满足我的业务需求的唯一关键。

        你去!

        【讨论】:

          【解决方案6】:

          唯一键:- 当你必须给出唯一值时应该使用它。在这种情况下 唯一键,这意味着也允许空值。唯一键是那些 在该列中唯一且不相似的键,例如 您的宠物名称。它可以与 null 完全不同,如果您在数据库上下文中询问,则必须注意每个 null 都与数据库中的另一个 null 不同。EXCEPT-SQL Server where null=null is true


          主键:- 当您必须唯一标识一行时应该使用它。primary 是数据库约束中每一行的唯一键,它不允许在其中出现 null。所以,您可能已经看到数据库有一个列是自动增量,它是表的主键。另外它可以用作另一个表中的外键。示例可以是订单表中的orderId账单表中的billId

          现在回到使用它的情况:-

          1) 列中的主键可以 在表中不为空,并且您在另一个中用作外键 建立关系表

          2) 表中的唯一键 无论您采用 null 对于特定列,例如餐厅中的小吃 可能你不在餐厅吃零食

          【讨论】:

            【解决方案7】:

            主键

            主键的主要目的是提供一种识别表中每条记录的方法。

            主键提供了一种使用行内数据来标识行的方法。主键可以基于一个或多个列,例如名字和姓氏;但是,在许多设计中,主键是从标识列自动生成的数字。

            主键具有以下特征:

            1. 一个表只能有一个主键。
            2. 主键由一列或多列组成。
            3. 主键强制表的实体完整性。
            4. 定义的所有列都必须定义为 NOT NULL。
            5. 主键唯一标识一行。
            6. 默认情况下,主键会产生 CLUSTERED 唯一索引。

            唯一键

            唯一键也称为唯一约束。唯一约束可用于确保行在数据库中是唯一的。

            我们不是已经用主键做到了这一点吗?是的,我们有,但是一个表可能有几组您想要唯一的列。

            在 SQL Server 中,唯一键具有以下特征:

            1. 一个表可以定义多个唯一键。
            2. 默认情况下,唯一键会产生非集群唯一索引。
            3. 一个或多个列组成一个唯一键。
            4. 列可以为 NULL,但每列允许有一个 NULL。
            5. 外键约束可以引用唯一约束。

            来源:here

            【讨论】:

              【解决方案8】:
              • 认为表名是employee。
              • 主键
              • 主键不能接受空值。主键强制 a 的唯一性 柱子。一个表中只能有一个主键。
              • 唯一键
              • 唯一键可以接受空值。唯一键还强制列的唯一性。您可以认为如果唯一键包含空值,那么为什么它可以是唯一的?是的,虽然它可以接受空值,但它强制列的唯一性。看看图片。这里 Emp_ID 是主要的,公民 ID 是唯一的。希望你能理解。我们可以在一个表中使用多个唯一键。

              【讨论】:

              • 我们不能在唯一键中插入多个空值,它也不允许重复。
              • @mahedi-hasan 唯一键列不应该只有一个 NULL 值吗? Citizen ID NULL 的最后两行怎么来的?我在这里错过了什么吗?
              • 刚刚得到了我上面自己评论的答案。看起来 MySQL 也允许多个 NULL 唯一,所以看起来 @Mahedi_Hasan 使用了 MySQL。 stackoverflow.com/questions/3712222/…
              • 是的..我想你明白了
              【解决方案9】:

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

              根据 RDBMS 的预期,键(a.k.a 候选键)是唯一标识实体的一个值或一组值。

              对于一个 DB-Table,存在很多键并且可能符合主键的条件。 这样所有的键、主键、唯一键等统称为候选键。 但是,DBA 从候选键中选择一个键来搜索记录,称为主键。

              主键和唯一键的区别

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

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

              3. Nullability:主键不包含 Null 值,而 Unique-key 可以。

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

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

              更多信息和示例:

              http://dotnetauthorities.blogspot.in/2013/11/Microsoft-SQL-Server-Training-Online-Learning-Classes-Integrity-Constraints-PrimaryKey-Unique-Key_27.html

              【讨论】:

              • 在第 5 点中,您说我们无法更改或删除主要值。我们当然可以使用更新语句来更改表中的主要值。
              • @Kapil 这样做超出了使用主键的全部目的。
              • 聚集索引:行在磁盘上的物理存储顺序与索引相同
              【解决方案10】:

              唯一键(英国):它是一列或一组列,可以标识一行中的唯一性。

              主键 (PK):它也是一列或一组列,可以识别行中的唯一性。

              所以主键只是唯一键的另一个名称,但是 SQL Server 中的默认实现对于主键和唯一键是不同的。

              默认:

              1. PK 创建聚集索引,UK 创建非聚集索引。
              2. PK 不为空,但 UK 允许为空(注意:默认情况下)
              3. 一张桌子上只能有一个PK,但可以有多个UK的
              4. 您可以根据需要覆盖默认实现。

              这真的取决于您在决定是创建 UK 还是 PK 时的目标。它遵循类似的类比 “如果是三个人的团队,那么他们都是同龄人,但其中会有一个是一对同龄人:PK和UK有相似的关系。”。我建议阅读这篇文章:作者给出的例子可能看起来不合适,但尝试获得一个整体的想法。

              http://tsqltips.blogspot.com/2012/06/difference-between-unique-key-and.html

              【讨论】:

              • 阅读大约 10 个网页,也就是说,PK 可以包含多个列。那么一张桌子上怎么可能只有一个PK呢?
              • @android 具有多个列的 PK 在唯一性方面充当单列。至少在 PostgreSQL 中,这意味着向表中添加了一个新列(默认名称为 [table_name]_pkey)(我听说这被称为代理键)。资料来源:postgresqltutorial.com/postgresql-primary-key我对这一切都很陌生,所以我希望能有一个知识渊博的海报指出我错过的细微差别。
              • 好吧,这不是专栏。我看错了。这是一个约束,而不是一个列。仍然有聚集索引,但它超过两列而不是一列。并且其中的每一列本身都不是主键,而是整个集合都是主键。因此,在这些情况下,PK 不会超过一个。
              【解决方案11】:

              如果您的数据库设计不需要外键,那么您可以使用唯一键(但记住唯一键允许单个空值)。

              如果您的数据库需要外键,那么您别无选择,您必须使用主键。

              要查看唯一键和主键之间的区别,请访问here

              【讨论】:

              • 可以从外键引用唯一约束。主键不是强制性的。
              【解决方案12】:

              简单来说,主键是唯一的不能为空,唯一的可以为空,不能是唯一的。

              【讨论】:

              • "unique 可以为 null 并且可能不是唯一的"。 may not be unique 在这里是什么意思?
              【解决方案13】:

              主键必须是唯一的。

              唯一键不一定是主键 - 请参阅 candidate key

              也就是说,一个表中可能有多个列组合可以唯一标识一行——其中只能选择一个作为主键。其他的,虽然是唯一的,但都是候选键。

              【讨论】:

                【解决方案14】:

                主键是唯一键。

                每个表必须最多一个主键,但它可以有多个唯一键。主键用于唯一标识表行。主键不能是 NULL,因为 NULL 不是值。

                【讨论】:

                  【解决方案15】:

                  主键具有标识数据库行的语义。因此,给定表只能有一个主键,而可以有多个唯一键。

                  出于同样的原因,主键不能为 NULL(至少在 Oracle 中,不确定其他数据库)

                  因为它标识了它永远不应该改变的行。更改主键必然会导致严重的痛苦,甚至可能是永恒的诅咒。

                  因此,在大多数情况下,您需要一些人为的主键 id,它只用于标识表中的单行。

                  另一方面,唯一键可以随意更改。

                  【讨论】:

                  • +1 提及永恒诅咒的风险。是时候将神学引入关系数据库理论了。
                  • PK 在 SQL Server 中也不能为 NULL
                  猜你喜欢
                  • 2011-09-16
                  • 2011-04-06
                  • 1970-01-01
                  • 2017-04-22
                  • 1970-01-01
                  • 2023-03-12
                  • 1970-01-01
                  • 2013-12-22
                  • 1970-01-01
                  相关资源
                  最近更新 更多