Why is negative id or zero considered a bad practice when inserting a primary key in a database table?

我认为它在某些情况下可能是有用的,但人们说不推荐这样做,尽管他们从来不说/知道为什么.

所以,我想知道,根据定义,是否有一些限制,或者它是否应该没有任何问题,或者如果这只是一个惯例,如果确实有一些限制,为什么那个功能没有被阻止?

推荐答案

需要明确的是,这个问题和答案是关于对代理键使用负数,而不是对自然键使用负数.

据我所知,有三个理由认为这是一种糟糕的做法.

  1. 它违反了principle of least surprise条规则.
  2. 有些人认为所有的身份证号码都不是负数.
  3. 有些人用负数表示错误.

第一种观点有一定的正确性.您从未在上看到过SQL示例或答案,因此使用了负ID号.(从今天开始,我将改变这一点.)

第二个和第三个是第一个的必然结果,因为程序员经常假设没有意外的行为.(这让我想起了VBA可以让我将两个日期相乘,返回一个数字,我想,这个数字可以用平方日期表示.)

对于第二个问题,应用程序程序员可能会引入一些微妙的错误,因为他们没有为登录UI代码留出空间,这可能会使-123456看起来像123456.

第三个是编写返回id号的代码.返回单个id号的代码可能会返回-1作为错误代码.但是-1在大多数情况下是有效的ID号.(大多数数据库不会将id号限制在非负整数的范围内.)

Database相关问答推荐

第一次请求后数据库连接关闭

为什么 INNER JOIN 不等于(!=)永远挂起

MySQL FIND_IN_SET 的对面

android 应用程序与 web 服务通信的安全性

如何在 MS Access 中实现 SQL INTERSECT 和 MINUS 操作

SQL Server - 使用计数函数与相交

跨不同数据库创建视图

如何验证 SQLAlchemy ORM 中的列数据类型?

我需要在这个 Django 模型中添加一个 db_index 吗?

SQL查询7天前的数据

每个 Docker 容器一个或多个数据库

如何更改 MySQL DB 中所有表的前缀?

如何通过 PHP 和 Linux 使用 pdo 连接到 mssql?

使用十进制数据类型(MySQL / Postgres)是否会影响性能

MongoDB中的数据库数据大小

SQL - 如何使用 MS SQL 2008 R2 备份数据库并导出为 MDF 文件

使用 Django 的复合/复合主/唯一键

sqlite 时间戳格式化

是否有用于 postgresql 的数据可视化工具,它也能够显示模式间关系?

如何使用 liquibase,一个具体的例子