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