【发布时间】:2015-11-17 21:05:37
【问题描述】:
我正在使用 SQL Server 并创建一个表(示例在这个问题的最底部)。但是,我在理解主键的实际工作方式以及如何正确使用它们时遇到了一些问题。
所以我知道主键可以确保表中的所有行都是唯一的,并且主键不能为空。我还阅读了这个页面index basics - simple talk,关于索引以及索引是如何在 b 树结构中组织的。
因此,在我的表中,要使一行具有唯一值,我必须使用前 3 列(UploadDate、SecID 和 FundCode 类型的 datetime、varchar(12) 和 varchar(6))。此表将仅使用选择查询,而 where 子句将使用刚才提到的三个字段中的一个或多个。
所以我知道可以在多个列上创建一个主键,所以在我的情况下,它将是上面的 3 个。虽然在我的表上有一个主键有助于提高选择查询的性能?因此,我认为主键会使用列的值(或在我的情况下为 3 列)创建索引或某种排序,我看不出这将有何帮助,因为我的值将是日期时间和两位文本?
有人提到我应该只创建一个带有递增数字的整数列并将其作为主键 - 我看不出这在运行选择查询时有什么帮助,因为新字段没有任何意义 & 不会' t 用于任何选择查询或查询的 where 子句?
type column name
------------- ------------
datetime UploadDate
varchar(12) SecID
varchar(6) FundCode
varchar(100) Name
float Price
float Nominal
int SourceCode
datetime PriceDate
一些行的例子
UploadDate SecID FundCode Name Price Nominal SourceCode PriceDate
2015-08-20 A045 ABCVPL Joe 1.3434 1000.33 3
2015-08-20 A563 ABCVPL Bob 1.5961 10.33 3
2015-08-20 A045 DEFGHJ Joe 1.3434 856.41 3
2015-08-20 XC45 PLMNOI Pip 2.3654 25.52 3
2015-08-20 KMM5 ABCVPL Nit 6.9565 1532 3
2015-08-21 A045 ABCVPL Joe 4.3434 1112 3
2015-08-21 GH45 DEFGHJ Joe 3.3434 16532 3
2015-08-21 PL34 DEFGHJ Joe 7.3434 635 3
2015-08-21 ER33 ABCVPL Joe 8.3434 6320 3
【问题讨论】:
-
“有人提到我应该只创建一个带有随机数的整数列” - 我会说这是错误的。递增数是,随机数不是。
-
这里有一些关于主键的不同“类型”的信息,以及使用它们的原因。 agiledata.org/essays/keys.html
-
我认为这可能已经在这里得到了回答:[SO:How To Speed Up SQL Queries][1] [1]: stackoverflow.com/questions/17354219/…
-
stackoverflow.com/questions/31949355/… 这个回答可能会有所帮助
标签: sql-server database-design sql-server-2012 primary-key