Sql 有没有不使用主键的好情况?

Sql 有没有不使用主键的好情况?,sql,sql-server,database,excel,database-design,Sql,Sql Server,Database,Excel,Database Design,我目前正在做的事情包括将几个Excel工作表转换为MS SQL Server数据库。其中大多数都是完全不相关的,不需要相互联系。有时,某些字段可能确实需要空条目 根据开发数据库的经验,您是否遇到过不使用主键的情况 如果没有,在这种情况下我能做什么?在我看来,每个数据库表都应该有一个主键。在维护数据时,这一点很重要。您可以直接更新和删除数据库中的特定行 某些数据库维护用户可见的内部行ID。这无疑是主键的一种可能的替代方案,但我更喜欢在那些数据库中明确定义主键 此外,整数标识主键执行以下操作: 它

我目前正在做的事情包括将几个Excel工作表转换为MS SQL Server数据库。其中大多数都是完全不相关的,不需要相互联系。有时,某些字段可能确实需要空条目

根据开发数据库的经验,您是否遇到过不使用主键的情况


如果没有,在这种情况下我能做什么?

在我看来,每个数据库表都应该有一个主键。在维护数据时,这一点很重要。您可以直接更新和删除数据库中的特定行

某些数据库维护用户可见的内部行ID。这无疑是主键的一种可能的替代方案,但我更喜欢在那些数据库中明确定义主键

此外,整数标识主键执行以下操作:

  • 它们标识插入到表中的顺序
  • 它们是对使用键的联接的轻微优化
  • 它们可以区分那些本来是重复的记录
  • 它们提供了一种“水印”机制,用于跟踪上次更新的记录

主键的问题与表中的其他属性是否允许空值没有直接关系,也与表是否需要链接到其他关系没有直接关系(尽管在这种链接中使用主键)

相反,主键都是关于建立和维护由表中的行表示的对象的标识。在任何应用程序中,如果您需要知道该行所指的是什么真实世界的“事物”,或者其中一个具有一组值的行与另一个具有相同值的行在各个方面不完全相同且不可互换,那么您将需要一个主键

当您的表仅用于生成单个源行没有意义的聚合结果时,您不需要主键。这确实涵盖了广泛的报告和分析情况。主键不会造成伤害,但在这种情况下没有意义


在分析情况下,如果数据是较大数据集的匿名提取,则可能需要特别避免使用主键。在这种情况下,没有主键有助于保证信息无法追溯到原始来源。

根据我的经验,有很多情况下不需要使用PK。特别是当您从外部源导入一些数据时,您可以将所有数据批量导入到一个暂存体系结构,然后再处理数据和分发(ETL)。这在性能和重复数据消除、清理等方面都更好

有时,您还可以使用一些字典表进行FREETEXT搜索,这也不需要PK


也就是说,在大多数情况下,您的生产表有一个PK有很多原因:性能、组织等。

如果您没有某种方法唯一地标识源数据中的每一行;您可能需要能够从数据中操作或检索特定的行,然后您可以创建一个人工主键。例如“入口ID”

我在您的示例中看到的主要问题是,您是否导入数据,然后需要对其进行修改

说你进口

Name | Age | Favourite Colour
-----------------------------
Anne | 23  |  red
John | 34  |  blue
John | 34  |  blue
如果你想删除一个34岁的约翰的蓝色,你会怎么做?嗯,使用一些笨拙的代码是可能的(我想您将有超过3列。)

但是如果你有这个

Entry_ID | Name | Age | Favourite Colour
----------------------------------------
10001    |Anne | 23  |  red
10002    |John | 34  |  blue
10003    |John | 34  |  blue
那就简单到

Delete from Table where Entry_ID = 10003

在我早期的数据库开发经验中,我经常省略主键,尤其是从其他地方导入的数据,如Excel工作表。没有什么可怕的事情发生。但现在回想起来,我是在玩火,很多事情都很容易出错

所以我认为这个问题最好的答案是把它翻过来:有没有过使用主键会是一个坏主意的情况?我想不出主键会导致问题的情况

至于转换Excel文件,我使用的方法是直接将Excel表作为一个表导入,该表仅用于存储数据,直到我将其放入一个“真实”表中供数据库使用。我使用主键
IDENTITY
field+Excel工作表中的所有字段创建“real”表,并使用
INSERT-in
传输数据。像这样:

CREATE TABLE real_table
    (
    Pkey int IDENTITY PRIMARY KEY not null
    , Column_A varchar(255) null
    , Column_B varchar(255) null
    )

INSERT INTO real_table(
    Column_A
    , Column_B)
select
    Column_A
    , Column_B
from Excel_import_table

如果您正在“动态”执行某些操作并导入没有主键的数据,那么这可能是正常的。但是,在某个阶段,你可能希望你有一个,并且希望你一开始就把它放进去。我当然有一些应用程序没有主键的表,但我很淘气!如果我想使用行ID作为替代选项,我怎么能这样做呢?就是这样,它们用于标签打印机。以前的解决方案,excel表格,被随意用作纯数据转储,我喜欢保持一个好的结构。我只是想知道当我的手绑在主键上时我能做什么,不要不同意你的一般建议,但是我在一个数据库中有一个没有主键的表。数据库是数TB的,主键将由一个占用空间的索引来支持,这绝对没有任何好处。该表具有自动生成的标识,该标识在功能上是PK;约束根本不存在。(聚集索引位于非唯一时间戳上。)这可能属于您的“内部行ID”规定范围。了解这一点,有什么好办法可以单独标识这些行?谢谢。这里的每个人都提供了大量信息。我刚从学校毕业,所以坚持读书是我的心事。这对我来说是一个非常奇怪的例子,这里的一切都是大量的原始数据,不需要限制和限制。这是一个很棒的id
CREATE TABLE real_table
    (
    Pkey int IDENTITY PRIMARY KEY not null
    , Column_A varchar(255) null
    , Column_B varchar(255) null
    )

INSERT INTO real_table(
    Column_A
    , Column_B)
select
    Column_A
    , Column_B
from Excel_import_table