为什么我们使用主键自动增量,而不仅仅是 auto_increment?

时间:2021-04-08 18:23:18

标签: sql sqlite primary-key auto-increment

我想知道为什么我们在 sql 中使用 PRIMARY_KEY_AUTO_INCREMENT 而不仅仅是 AUTO_INCREMENT 作为表中的 id。如果我们只是将 id 的数据类型设置为 AUTO_INCREMENT,它会不会自动递增,从而每次生成一个 唯一 id?因此,在顶部设置PRIMARY_KEY(它唯一标识表中的每个项目)有什么意义?

谢谢!!

3 个答案:

答案 0 :(得分:1)

因为 constraints,因为 SQL 是一个 declarative language,并且因为它是自记录的。

AUTO_INCREMENTPRIMARY KEY 做两件截然不同的事情。

AUTO_INCREMENT 不是标准的 SQL,但大多数数据库都有类似的东西。 In 通常将默认值设为递增整数。这就是主键的机制元素:自动递增的整数是一个不错的唯一 ID。

PRIMARY KEY 做了很多事情。

  1. 列是 not null
  2. 列是 unique
  3. (非标准,但几乎总是)列已编入​​索引。
  4. 列被声明为主键。
  5. 不能将其他列声明为主键。

大多数是对价值的约束。它必须存在 (1),它必须是唯一的 (2),并且它必须是唯一的主键 (5)。约束保证数据符合您的预期。如果没有它们,您可能会意外插入具有相同主键或没有主键的多行。或者该表可能有多个“主”键,您使用哪个?有了约束,您就不必在每次获取数据时都检查数据,您知道它会在声明的约束范围内。

索引主键 (3) 是一种优化。您可能会经常按主键进行搜索。索引不是 SQL 标准的一部分。这可能令人惊讶。它们是实现 SQL 的一个细节。索引不会影响查询的结果,并且 SQL 标准避免告诉数据库它们应该如何做事。这就是 SQL 无处不在的部分原因,它是声明性的。

在声明式语言中,您不会说如何去做,而是说您想要什么。 SQL 查询会说明您想要什么结果,然后数据库会为您计算出来。您可以将上述大部分内容作为约束和触发器来实现,但是如果您这样做了,数据库将无法理解为什么您要这样做,并且无法使用它来帮助您。通过向数据库声明“这是主键”,它可以按照它认为合适的方式处理。数据库添加了必要的约束。数据库添加了它的优化,这不仅仅是索引。数据库可以在查询中使用此信息来识别唯一的行。您将受益于 50 年的数据库理论。

最后,它让人们知道列的目的。任何人都可以阅读架构并知道列是主键。六个月后,任何人都可以成为你。

答案 1 :(得分:0)

Tbh 我真的不知道这是否是原因,但是通过创建主键,您可以创建索引。索引有助于加快查询速度。您可以手动创建它们,但它们也是在主键和外键上创建的。

答案 2 :(得分:0)

这是 DBMS 特定的问题。让我们试着找出一些共同的利弊。

实际上,我认为定义主键或使任何列自动递增之间没有任何相似之处。

主键不必是增量的,而是唯一的。

如果您只是将一列用作自动增量,那么如果您不小心或故意重置自动增量起始值,则多列可能具有相同的值。

但是如果您将其定义为主键,则无需担心。 如果它是主键,那么您可以将其用作其他表中的外键。 在 SQL Server 中,主键会自动创建一个簇索引,该索引将定义表中数据的物理存储顺序。