AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 2895
Accepted
That Realtor Programmer Guy
That Realtor Programmer Guy
Asked: 2011-05-24 12:50:10 +0800 CST2011-05-24 12:50:10 +0800 CST 2011-05-24 12:50:10 +0800 CST

否定键是做什么用的?

  • 772

使用标准 SQL 数据库(目前主要使用 MySQL)有点新意,到目前为止,我还没有遇到过这种情况。

何时以及为什么使用负(或更确切地说是有符号)键来索引表是有用的?

database-design database-recommendation
  • 3 3 个回答
  • 8209 Views

3 个回答

  • Voted
  1. Best Answer
    jcolebrand
    2011-05-24T13:28:06+08:002011-05-24T13:28:06+08:00

    所有主键都是我们确定的值,它是记录中最重要的值。无论该密钥是有符号整数、无符号整数、字符串、blob(实际上是有限制的)还是 UUID(或今天采用的任何名称),事实仍然表明它是一个密钥,并且它是最重要的事情。

    由于我们不限于只使用正向数字作为我们的密钥,因此考虑到有符号整数只会达到约 20 亿,而无符号整数将达到约 40 亿是有意义的。但是使用带符号的 int 并没有错,将初始值设置为 ~ -20 亿并设置增量为 1。在约 20 亿条记录之后,您将达到“零”,然后您将继续达到约 20 亿条记录。

    至于为什么在表中使用“否定键”会有所帮助,这与“为什么在表中使用键有帮助”是同一个问题。键的“值”对其作为键的状态没有影响。一把钥匙,一把钥匙,一把钥匙。

    重要的是密钥是否有效。

    至于为什么允许使用负数的键是有用的,我可以提出一些理由:

    如果您想将销售系统中的退货指示为负销售订单号,与正销售订单号匹配,从而使关联变得容易(这是幼稚的,设计不佳,但它可以在“电子表格”的意义上工作)。

    如果您想要一个用户表,并指出带有负数的表是系统控制的(对于聊天提要用户,这正是这样做的)。

    我可以继续说下去,但实际上负数之所以重要的唯一原因是你或我是否重视它。除此之外,密钥的价值与密钥本身没有任何关系。

    • 14
  2. gbn
    2011-05-24T20:55:05+08:002011-05-24T20:55:05+08:00

    如果我们在关于标识或自动编号列,值本身应该没有意义。(有时确实如此,根据 drachenstern 提到的 SO 的聊天用户,这是我自己之前做过的)

    但是,如果您使用有符号整数,通常会丢失一半的范围。
    请参阅:当表中的字段接近最大有符号或无符号 32 位整数时该怎么办?

    另一个例子:在小型复制场景中,对一个站点使用负值而对另一个站点使用正值可以隐含地了解任何给定行的来源。

    • 11
  3. David Spillett
    2011-05-25T01:24:00+08:002011-05-25T01:24:00+08:00

    并非所有数据库系统都支持无符号整数类型,MSSQL 就是其中之一。在这些情况下,整数键字段中可能存在负值,因为它们可能存在于类型中(您可以使用规则或触发器来阻止它们,如本示例所示,但可能不需要添加强制执行此类规则的开销每个中间件/更新)。

    就数据库而言,主键的实际值并不重要,只要它在表中是唯一的即可。对它来说,-42 和 42 只是两个不同的数字,就像 42 和 69 一样 - 含义只会被你的代码赋予负值或非值。

    不支持无符号整数类型可能是基于降低复杂性的设计决策——即不希望两个不同的 32 位整数类型担心在它们之间分配值时检查范围。它确实将自动增量字段中可能的索引数量限制为从 0 或 1 开始的无符号类型(~2e9 而不是~4e9)可能的一半,但这很少是一个重要问题(如果您可能需要无论如何,您可能会选择 64 位类型的许多关键值,特别是如果使用 64 位架构,其中这些值的处理效率不低于 32 位的),但如果您可能想要完整范围并需要出于空间原因坚持使用 32 位,您可以从 -2,147,483,647 开始增量。

    • 9

相关问题

  • MySQL VARCHAR 和 TEXT 数据类型有什么区别?

  • 存储计算值或根据要求重新计算它们更好吗?[复制]

  • 存储与计算聚合值

  • 推荐使用哪些数据库作为嵌入式数据库?

  • 在数据仓库中实现多对多关系有哪些方法?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve