SQL部分主键,复合键

SQL部分主键,复合键,sql,Sql,在author/title实体中,两个主键应该一起作为主键,在sql中如何做到这一点。我是否需要创建一个保存这些值的新键?我知道一个实体中不允许有两个主键,但我不知道如何写它们是compiste key/partial primary key。我正在使用SQLServer2008 这是er图的链接 在不考虑您模型的正确性的情况下,复合模型。复合主键可以这样创建: CREATE TABLE "Author/Title" ( author_name VARCHAR(50), isbn

在author/title实体中,两个主键应该一起作为主键,在sql中如何做到这一点。我是否需要创建一个保存这些值的新键?我知道一个实体中不允许有两个主键,但我不知道如何写它们是compiste key/partial primary key。我正在使用SQLServer2008

这是er图的链接


在不考虑您模型的正确性的情况下,复合模型。复合主键可以这样创建:

CREATE TABLE "Author/Title" (
    author_name VARCHAR(50),
    isbn VARCHAR(13) REFERENCES "Item Details",
    PRIMARY KEY (author_name, isbn)
)
这将允许同一作者的名字有不同的isbn,并且仍然被认为是唯一的,反之亦然


通过将这两个字段标记为PK的一部分,可以在SQL Server Management Studio中实现类似的效果。

而无需讨论模型的正确性,即复合aka。复合主键可以这样创建:

CREATE TABLE "Author/Title" (
    author_name VARCHAR(50),
    isbn VARCHAR(13) REFERENCES "Item Details",
    PRIMARY KEY (author_name, isbn)
)
这将允许同一作者的名字有不同的isbn,并且仍然被认为是唯一的,反之亦然


通过将两个字段标记为PK的一部分,SQL Server Management Studio也可以实现类似的效果。

您可以选择两个属性作为主键或主键作者,标题应为help@spandy如果我使用主键author,title,那么我需要一个保存这些属性的新键。如何选择这些属性作为主键而不创建新键。感谢您的快速回复-感谢您从SQL完成此操作。在SSMS中,从表编辑器中选择两列并选择主键。@Magnus-我强烈不同意只有运行的数字/GUID才能用于PK的观点。这是微软的方式,是的,但在这方面有两个学派。主键的用途是表示某些内容—它表示表中的所有数据都与该特定键有关。可能存在代理密钥(SSN、运行编号、GUID等),这些密钥是唯一的,可用于标识特定记录,但这些通常不是数据所涉及的内容。使用运行中的数字作为主键是真正思考数据的捷径。@Magnus请不要太苛刻。正如我所说:使用计数器字段作为主键是一种哲学。您会发现,如果您使用guid作为主键并在这些主键上进行集群,那么您将过度地重新平衡索引。此外,集群是一个单独的问题-基于优化数据访问的集群数据排序方式对锁定和查询有一定影响,而不是采用默认的集群索引。如果您正在编写自己的DDL语句,您可以选择如何进行集群,并且除了在后台隐藏之外,没有默认集群。您可以选择两个属性作为主键或主键作者,标题应为help@spandy如果我使用主键author,title,那么我需要一个保存这些属性的新键。如何选择这些属性作为主键而不创建新键。感谢您的快速回复-感谢您从SQL完成此操作。在SSMS中,从表编辑器中选择两列并选择主键。@Magnus-我强烈不同意只有运行的数字/GUID才能用于PK的观点。这是微软的方式,是的,但在这方面有两个学派。主键的用途是表示某些内容—它表示表中的所有数据都与该特定键有关。可能存在代理密钥(SSN、运行编号、GUID等),这些密钥是唯一的,可用于标识特定记录,但这些通常不是数据所涉及的内容。使用运行中的数字作为主键是真正思考数据的捷径。@Magnus请不要太苛刻。正如我所说:使用计数器字段作为主键是一种哲学。您会发现,如果您使用guid作为主键并在这些主键上进行集群,那么您将过度地重新平衡索引。此外,集群是一个单独的问题-基于优化数据访问的集群数据排序方式对锁定和查询有一定影响,而不是采用默认的集群索引。如果您正在编写自己的DDL语句,您可以选择如何进行集群,并且除了在后台隐藏之外,没有默认的集群。与上面的讨论一致,对于这个表,最好使用代理键,而不是键本身。换句话说:使用一些ID字段将两者联系起来——这样,如果作者的名字发生了变化,您就不必将变化级联到此表,因为ID字段不会发生变化。@DavidT.Macknet代理有自己的位置,但不是免费的,不应盲目使用。我完全了解更新级联问题,但也有。代理。。。我们不是免费的。嗯,不,他们不是很自由,除非在某些情况下。如果没有聚集索引,SQL Server将在后台构建一个RowID字段,在该字段上构建一个聚集索引,然后
将所有其他索引映射到该聚集索引中。因此,尽管您看不到它,但在该实例中构建一个没有代理的表所需的成本同样高。如果你过于担心,或者正在处理巨大的数据集,我可以看到你想仔细考虑的地方。但是,在上述情况下,将有性能提升,而且不需要级联。@DavidT.Macknet如果表中有一个自然键,代理不能替换它。我不确定OP试图在这里建模什么,但是如果她试图说没有相同的组合或者这两个字段可以存在不止一次,那么我们必须有这个自然键,不管代理是否也存在。至于集群参数,集群用于范围扫描,这与代理基本不兼容。上面的自然键也是一个聚类键,因为未使用NONCLUSTERED将属于同一作者的行很好地聚类在一起……范围扫描基本上与代理不兼容。我认为情况并非如此。例如,如果在此链接表中为作者执行删除操作,并且代理项键为聚集的author\u id、isbn\u id,则删除或查询将是最佳的,占用更少的资源。当然,是否有理由向该表添加额外的标识字段是另一回事。与上面的讨论一致,对于该表,使用代理键(而不是键本身)可能更好。换句话说:使用一些ID字段将两者联系起来——这样,如果作者的名字发生了变化,您就不必将变化级联到此表,因为ID字段不会发生变化。@DavidT.Macknet代理有自己的位置,但不是免费的,不应盲目使用。我完全了解更新级联问题,但也有。代理。。。我们不是免费的。嗯,不,他们不是很自由,除非在某些情况下。如果没有聚集索引,SQL Server将在后台构建一个RowID字段,在该字段上构建一个聚集索引,并将所有其他索引映射到该聚集索引中。因此,尽管您看不到它,但在该实例中构建一个没有代理的表所需的成本同样高。如果你过于担心,或者正在处理巨大的数据集,我可以看到你想仔细考虑的地方。但是,在上述情况下,将有性能提升,而且不需要级联。@DavidT.Macknet如果表中有一个自然键,代理不能替换它。我不确定OP试图在这里建模什么,但是如果她试图说没有相同的组合或者这两个字段可以存在不止一次,那么我们必须有这个自然键,不管代理是否也存在。至于集群参数,集群用于范围扫描,这与代理基本不兼容。上面的自然键也是一个聚类键,因为未使用NONCLUSTERED将属于同一作者的行很好地聚类在一起……范围扫描基本上与代理不兼容。我认为情况并非如此。例如,如果在此链接表中为作者执行删除操作,并且代理项键为聚集的author\u id、isbn\u id,则删除或查询将是最佳的,占用更少的资源。当然,是否有向该表添加额外标识字段的参数是另一回事。