【问题标题】:PostgreSQL, MonetDB and MySQL add primary key to existing tablePostgreSQL、MonetDB 和 MySQL 将主键添加到现有表
【发布时间】:2018-03-17 23:06:36
【问题描述】:

当我向已经有数据的表添加主键时,这些数据库管理系统分别做什么?

他们是否分析了列的每个值以确认它是唯一的? 还是他们有其他优化机制?如果是这样的话,那是什么机制?

【问题讨论】:

  • "他们是否分析了列的每个值以确认它是唯一的?"简短的回答是的。
  • 但是它们之间有什么区别呢?他们中的任何一个都有一些优化方法吗? @RaymondNijland
  • 你为什么要问三个不同的数据库?
  • @GordonLinoff 因为我需要知道这一点才能获得大学论文,而且我搜索了很多,但几乎没有找到任何东西
  • @JoãoAmorim 。 . .我承认答案可能隐藏在文档中(例如,在postgresql.org/docs/current/static/sql-altertable.html 中搜索“添加主键”)。但是主键需要唯一索引,因此必须创建某种索引。这可能属于“分析”的范畴。

标签: mysql sql database postgresql monetdb


【解决方案1】:

是的,至少在 PostgreSQL 和 MySQL(也可能是 MonetDB)中,DBMS 将首先检查所有值是否都是唯一的(例如在 sql 查询中使用“唯一”参数时)。您可以通过计算所有行然后计算相同行的“唯一”选择来模拟它。如果行号不相等,您将无法创建主键。 确实创建了索引,但只是为了在创建后使用主键来加快速度。

【讨论】:

  • 索引创建(通常)作为主键创建过程的一部分。它不是“只是为了加快速度”而创建的。它启用了验证唯一性的功能。诚然,这可以在没有唯一索引的情况下完成。我知道没有数据库不需要唯一索引。
  • 没错,我想说的是,作为主键一部分的索引只会在创建主键后使用,不会在主键创建过程中使用。
  • 所以基本上,他们必须将每个值与其余值进行比较,而这些 DMS 都没有使用某种优化过程?
  • 有很多方法可以进行唯一检查,将每一行与所有其他行进行比较将是一个非常糟糕的选择。但是所有的行都会被检查,是的。
猜你喜欢
  • 2016-07-27
  • 2012-08-01
  • 2014-02-20
  • 1970-01-01
  • 2012-11-25
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
  • 2020-06-09
相关资源
最近更新 更多