【问题标题】:Using 0 as Primary Key使用 0 作为主键
【发布时间】:2020-09-22 02:32:35
【问题描述】:

我经常使用查找表,有时我在查找表中有一些默认记录,我认为对于这条记录,我可以使用 0 作为主键 a,如下所示:

项目:

Id   |  Name        | Description
----------------------------------------------------
0    |  General     | Used for general situations
1    |  Project A   | ...
2    |  Project B   | ...
3    |  Project C   | ...

通过这样做,我可以从 1 开始获取实际项目值(A、B、C...),另一方面,我可以轻松地将其他表的一般/默认值区分为 FK。

状态:

Id   |  ProjectId   | Name        
----------------------------------------------------
1    |  0           | Deleted     
2    |  0           | Active
3    |  0           | Passive
4    |  1           | Waiting for Approval
5    |  2           | Waiting for Sales
6    |  3           | Waiting for Service

上面的方法是错误的还是使用0作为PK/FK会有问题?

【问题讨论】:

  • 主键是数据库功能。 Java 或 C# 没有主键(或外键)的概念。即使您使用NULL 作为主键,语言也不会在意,如果database allows it
  • 将主键链接到数据是没有意义的。
  • 谢谢,实际上我想到了实体框架代码优先方法,因此我想到了 Java/C#。我更新了标签。
  • 既然它是一个代理键,你不应该真正关心它是01-42还是4243。如果您要根据主键的值编写逻辑,那么您的设计就很糟糕。
  • 主键的值通常是完全任意的。通常它甚至不暴露给表示层,因为它纯粹用于提供对象之间的关系。显示的值通常是与该 ID 相关的“名称”,在本例中为项目名称。 PK 不必从1 开始。事实上,在某些设计中,您会发现人们从 -2,147,483,648(甚至 -9,223,372,036,854,775,808)开始,以从 int(bigint) 数据类型和 IDENTITY 中获取最大数量的可能值。

标签: java c# sql-server database postgresql


【解决方案1】:

0 只是任何数字数据类型的另一个有效数字。它可以像任何其他列一样写入 PK 或 FK 列。在 Postgres 中得到了肯定的测试,但在任何关系 RDMS 中都可以肯定。

serialIDENTITY 列通常以 1 开头,但这只是一个约定。

【讨论】:

    猜你喜欢
    • 2016-03-31
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多