如何跨两个表共享相同的主键?

时间:2011-05-18 14:38:09

标签: sql sql-server tsql

我正在阅读EF4上的一本书,我遇到了这个问题:

enter image description here

所以我想知道如何创建这个数据库,以便我可以按照本书中的示例进行操作。

如何使用简单的TSQL命令创建这些表?忘记创建数据库,想象它已经存在。

4 个答案:

答案 0 :(得分:36)

您已获得代码。我想分享一些关于为什么你可能希望在这样的关系中有两个表的信息。

首先,当两个表具有相同的主键并具有外键关系时,这意味着它们具有一对一的关系。那么为什么不把它们放在同一张桌子上呢?将一些信息拆分到单独的表中有几个原因。

首先,信息在概念上是分开的。如果第二个表中包含的信息与单独的特定问题有关,则可以更轻松地使用它,数据位于单独的表中。例如,在你的例子中,他们已经分离出图像,即使他们只打算每个SKU有一个记录。如果您决定需要多个图像,这使您可以灵活地在以后轻松地将表格更改为一对多关系。这也意味着当你只查询图像时,你不必实际击中另一个(可能是更大的)表。

这让我们有理由两个人这样做。您目前只有一对一的关系,但您知道未来的版本已经安排将其转换为一对多的关系。在这种情况下,设计到单独的表中更容易,因此当您移动到该结构时,您不会破坏所有代码。如果我打算这样做,我会继续创建一个代理键作为PK,并在FK上创建一个唯一的索引。这样,当您转到一对多关系时,您只需删除唯一索引并将其替换为常规索引。

分离一对一关系的另一个原因是表格是否过宽。有时您只是拥有太多关于实体的信息,以便轻松地将其放入记录可以具有的最大大小。在这种情况下,您倾向于使用最少使用的字段(或概念上适合的字段)并将它们移动到单独的表中。

将它们分开的另一个原因是,虽然您有一对一的关系,但您可能不需要记录父表中大多数记录的子表中的内容。因此,不是在父表中有很多空值,而是将其拆分出来。

其他人显示的代码假定基于字符的PK。如果在拥有自动生成的Int或GUID时需要此类关系,则只需在父表上执行自动生成。然后将该值存储在子表中,而不是在该表上生成新值。

答案 1 :(得分:4)

当它表示表共享相同的主键时,它只表示每个表中都有一个具有相同名称的字段,都设置为主键。

创建表

CREATE TABLE [Product (Chapter 2)](
    SKU varchar(50) NOT NULL,
    Description varchar(50) NULL,
    Price numeric(18, 2) NULL,
    CONSTRAINT [PK_Product (Chapter 2)] PRIMARY KEY CLUSTERED 
    (
        SKU ASC
    )
)

CREATE TABLE [ProductWebInfo (Chapter 2)](
    SKU varchar(50) NOT NULL,
    ImageURL varchar(50) NULL,
    CONSTRAINT [PK_ProductWebInfo (Chapter 2)] PRIMARY KEY CLUSTERED 
    (
        SKU ASC
    )
)

创建关系

ALTER TABLE [ProductWebInfo (Chapter 2)] 
    ADD CONSTRAINT fk_SKU 
    FOREIGN KEY(SKU)
REFERENCES [Product (Chapter 2)] (SKU)

如果表名只是单个单词(而不是关键字),可能看起来有点简单,例如,如果表名只是ProductProductWebInfo,而没有{附加{1}}:

(Chapter 2)

答案 2 :(得分:1)

这只是我在SSMS中使用表设计器汇总的一个例子,但是应该给你一个想法(注意最后的外键约束):

CREATE TABLE dbo.Product
    (
    SKU int NOT NULL IDENTITY (1, 1),
    Description varchar(50) NOT NULL,
    Price numeric(18, 2) NOT NULL
    )  ON [PRIMARY]

ALTER TABLE dbo.Product ADD CONSTRAINT
    PK_Product PRIMARY KEY CLUSTERED 
    (
    SKU
    )

CREATE TABLE dbo.ProductWebInfo
    (
    SKU int NOT NULL,
    ImageUrl varchar(50) NULL
    )  ON [PRIMARY]

ALTER TABLE dbo.ProductWebInfo ADD CONSTRAINT
    FK_ProductWebInfo_Product FOREIGN KEY
    (
    SKU
    ) REFERENCES dbo.Product
    (
    SKU
    ) ON UPDATE  NO ACTION 
     ON DELETE  NO ACTION 

答案 3 :(得分:0)

了解如何创建外键约束。 http://msdn.microsoft.com/en-us/library/ms175464.aspx这也有创建表的链接。您还需要创建数据库。

回答你的问题:

ALTER TABLE ProductWebInfo
ADD CONSTRAINT fk_SKU
FOREIGN KEY (SKU)
REFERENCES Product(SKU)